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)
	}
}
相关推荐
一丝晨光4 天前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
陌尘(MoCheeen)5 天前
技术书籍推荐(002)
java·javascript·c++·python·go
白泽来了7 天前
字节大模型应用开发框架 Eino 全解(一)|结合 RAG 知识库案例分析框架生态
开源·go·大模型应用开发
致于数据科学家的小陈7 天前
Go 层级菜单树转 json 处理
python·go·json·菜单树·菜单权限·children
白总Server9 天前
Golang领域Beego框架的中间件开发实战
服务器·网络·websocket·网络协议·udp·go·ssl
ん贤9 天前
GoWeb开发
开发语言·后端·tcp/ip·http·https·go·goweb
纪元A梦9 天前
华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od·go
chxii12 天前
3.2goweb框架GORM
go
42fourtytoo13 天前
从0开始建立Github个人博客(hugo&PaperMod)
运维·服务器·python·go·github
xuhe213 天前
[tldr] GO语言异常处理
go·error