GO Date数据处理

今天封装了一个go 的date数据处理,方便以后直接用

1、创建dateformat.go文件

package model

import (
	"fmt"
	"time"
)

type dateFormatter struct {
	time.Time
}

// ConvertTimeStringToTimestamp 将指定格式的时间字符串转换为 Unix 时间戳
func (u *dateFormatter) ConvertTimeStringToTimestamp(timeString, layout string) (int64, error) {
	t, err := time.Parse(layout, timeString)
	if err != nil {
		return 0, err
	}
	return t.Unix(), nil
}

// ConvertTimeStringFormat 将时间字符串从一种格式转换为另一种格式
func (u *dateFormatter) ConvertTimeStringFormat(timeString, originalLayout, newLayout string) (string, error) {
	t, err := time.Parse(originalLayout, timeString)
	if err != nil {
		return "", err
	}
	return t.Format(newLayout), nil
}

// CalculateDateDifference 计算两个日期之间的天数差

func (u *dateFormatter) CalculateDateDifference(date1, date2, layout string) (int, error) {
	d1, err := time.Parse(layout, date1)
	if err != nil {
		return 0, err
	}
	d2, err := time.Parse(layout, date2)
	if err != nil {
		return 0, err
	}

	duration := d2.Sub(d1)
	return int(duration.Hours() / 24), nil
}

// AddDaysToDate 为指定日期增加或减少天数
func (u *dateFormatter) AddDaysToDate(date string, days int, layout string) (string, error) {
	d, err := time.Parse(layout, date)
	if err != nil {
		return "", err
	}

	newDate := d.Add(time.Duration(days) * 24 * time.Hour)
	return newDate.Format(layout), nil
}

// ConvertTimestampToTimeString 将 Unix 时间戳转换为指定格式的时间字符串
func (u *dateFormatter) ConvertTimestampToTimeString(timestamp int64, layout string) string {
	t := time.Unix(timestamp, 0)
	return t.Format(layout)
}

// CompareDates 比较两个日期,返回-1(日期1早于日期2),0(日期相等),1(日期1晚于日期2)
func (u *dateFormatter) CompareDates(date1, date2, layout string) (int, error) {
	d1, err := time.Parse(layout, date1)
	if err != nil {
		return 0, err
	}
	d2, err := time.Parse(layout, date2)
	if err != nil {
		return 0, err
	}

	if d1.Before(d2) {
		return -1, nil
	}
	if d1.After(d2) {
		return 1, nil
	}
	return 0, nil
}

// ConvertTimeRange 解析并转换时间区间为指定格式或Unix时间戳
func (u *dateFormatter) ConvertTimeRange(startTimeStr, endTimeStr, layout, outputLayout string) (string, string, error) {
	startTime, err := time.Parse(layout, startTimeStr)
	if err != nil {
		return "", "", err
	}

	endTime, err := time.Parse(layout, endTimeStr)
	if err != nil {
		return "", "", err
	}

	if outputLayout == "unix" {
		// 返回Unix时间戳
		startUnix := fmt.Sprintf("%d", startTime.Unix())
		endUnix := fmt.Sprintf("%d", endTime.Unix())
		return startUnix, endUnix, nil
	} else {
		// 返回指定格式的字符串
		startFormatted := startTime.Format(outputLayout)
		endFormatted := endTime.Format(outputLayout)
		return startFormatted, endFormatted, nil
	}
}

// ExtractDateComponents 从字符串日期中提取年、月、日、小时、分钟、秒等数据
func (u *dateFormatter) ExtractDateComponents(dateStr, layout string) (int, int, int, int, int, int, error) {
	date, err := time.Parse(layout, dateStr)
	if err != nil {
		return 0, 0, 0, 0, 0, 0, err
	}

	year := date.Year()
	month := int(date.Month())
	day := date.Day()
	hour := date.Hour()
	minute := date.Minute()
	second := date.Second()

	return year, month, day, hour, minute, second, nil
}

// ConvertISOToCustomFormat 将ISO时间格式转换为指定的格式
func (u *dateFormatter) ConvertISOToCustomFormat(isoTimeStr, outputLayout string) (string, error) {
	date, err := time.Parse(time.RFC3339, isoTimeStr)
	if err != nil {
		return "", err
	}

	return date.Format(outputLayout), nil
}

2、创建单元测试测试文件

dateformat_test.go

package model

import (
	"fmt"
	"testing"
)

func TestConvertISOWithTimezone(t *testing.T) {
	isoTimeStr := "2024-08-30T14:00:00+02:00"
	testData := dateFormatter{}

	// 转换为自定义格式
	customFormat, err := testData.ConvertISOToCustomFormat(isoTimeStr, "2006-01-02 15:04:05 MST")
	if err != nil {
		fmt.Println("Error converting ISO time:", err)
	} else {
		fmt.Println("Converted Time:", customFormat)
	}

	// 另一个转换例子:转换为UTC时间格式
	customUTCFormat, err := testData.ConvertISOToCustomFormat(isoTimeStr, "2006-01-02 15:04:05 UTC")
	if err != nil {
		fmt.Println("Error converting ISO time:", err)
	} else {
		fmt.Println("Converted UTC Time:", customUTCFormat)
	}
}
func TestConvertISOToCustomFormat(t *testing.T) {
	isoTimeStr := "2024-08-30T14:00:00Z"
	testData := dateFormatter{}
	// 转换为自定义格式
	customFormat, err := testData.ConvertISOToCustomFormat(isoTimeStr, "2006-01-02 15:04:05")
	if err != nil {
		fmt.Println("Error converting ISO time:", err)
	} else {
		fmt.Println("Converted Time:", customFormat)
	}

	// 另一个转换例子:只显示日期部分
	customDateFormat, err := testData.ConvertISOToCustomFormat(isoTimeStr, "2006-01-02")
	if err != nil {
		fmt.Println("Error converting ISO time:", err)
	} else {
		fmt.Println("Converted Date:", customDateFormat)
	}
}

func TestTimestampToTimeString(t *testing.T) {
	testData := dateFormatter{}
	timestamp := int64(1725002400)
	layout := "2006-01-02 15:04:05"

	formattedTime := testData.ConvertTimestampToTimeString(timestamp, layout)
	fmt.Println("Formatted Time:", formattedTime)
}
func TestCalculateDateDifference(t *testing.T) {
	testData := dateFormatter{}
	days, err := testData.CalculateDateDifference("2024-08-30", "2024-09-05", "2006-01-02")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Difference in days:", days)
	}
}

func TestDateFormatMain(t *testing.T) {

	testData := dateFormatter{}
	timeString := "2024-08-30 14:00:00"
	layout := "2006-01-02 15:04:05"

	timestamp, err := testData.ConvertTimeStringToTimestamp(timeString, layout)
	if err != nil {
		fmt.Println("Error converting time string to timestamp:", err)
	} else {
		fmt.Println("Unix Timestamp:", timestamp)
	}
}

func TestCompareDates(t *testing.T) {
	testData := dateFormatter{}
	result, err := testData.CompareDates("2024-08-30", "2024-09-05", "2006-01-02")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Comparison Result:", result)
	}
}

func TestAddDaysToDate(t *testing.T) {
	testData := dateFormatter{}
	newDate, err := testData.AddDaysToDate("2024-08-30", 10, "2006-01-02")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("New Date:", newDate)
	}
}
func TestConvertTimeStringFormat(t *testing.T) {
	originalTimeString := "2024-08-30 14:00:00"
	originalLayout := "2006-01-02 15:04:05"
	newLayout := "02-01-2006 03:04 PM"
	testData := dateFormatter{}
	newTimeString, err := testData.ConvertTimeStringFormat(originalTimeString, originalLayout, newLayout)
	if err != nil {
		fmt.Println("Error converting time string format:", err)
	} else {
		fmt.Println("New Formatted Time:", newTimeString)
	}
}

func TestConvertTimeRange(t *testing.T) {
	// 示例1:将时间区间转换为Unix时间戳
	testData := dateFormatter{}

	startUnix, endUnix, err := testData.ConvertTimeRange("2024-08-30 14:00:00", "2024-09-01 18:00:00", "2006-01-02 15:04:05", "unix")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Start Unix Timestamp:", startUnix)
		fmt.Println("End Unix Timestamp:", endUnix)
	}

	// 示例2:将时间区间转换为新的日期格式
	startFormatted, endFormatted, err := testData.ConvertTimeRange("2024-08-30 14:00:00", "2024-09-01 18:00:00", "2006-01-02 15:04:05", "02-Jan-2006 03:04 PM")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Start Formatted Time:", startFormatted)
		fmt.Println("End Formatted Time:", endFormatted)
	}
}

func TestExtractDateComponents(t *testing.T) {
	dateStr := "2024-08-30 14:00:00"
	layout := "2006-01-02 15:04:05"
	testData := dateFormatter{}

	year, month, day, hour, minute, second, err := testData.ExtractDateComponents(dateStr, layout)
	if err != nil {
		fmt.Println("Error parsing date:", err)
	} else {
		fmt.Printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d\n", year, month, day, hour, minute, second)
	}
}
相关推荐
不爱说话郭德纲6 小时前
聚焦 Go 语言框架,探索创新实践过程
go·编程语言
0x派大星1 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
IT书架2 天前
golang高频面试真题
面试·go
郝同学的测开笔记2 天前
云原生探索系列(十四):Go 语言panic、defer以及recover函数
后端·云原生·go
秋落风声2 天前
【滑动窗口入门篇】
java·算法·leetcode·go·哈希表
0x派大星4 天前
【Golang】——Gin 框架中的模板渲染详解
开发语言·后端·golang·go·gin
0x派大星5 天前
【Golang】——Gin 框架中的表单处理与数据绑定
开发语言·后端·golang·go·gin
三里清风_6 天前
如何使用Casbin设计后台权限管理系统
golang·go·casbin
0x派大星6 天前
【Goland】——Gin 框架中间件详解:从基础到实战
开发语言·后端·中间件·golang·go·gin
0x派大星6 天前
【Goland】——Gin 框架简介与安装
后端·golang·go·gin