GO Date数据处理

2024-08-30 14:44
文章标签 go date 数据处理

本文主要是介绍GO Date数据处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天封装了一个go 的date数据处理,方便以后直接用
1、创建dateformat.go文件

package modelimport ("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 modelimport ("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)}
}

这篇关于GO Date数据处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121118

相关文章

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Go Select的实现

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局 了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导

Go Channel的实现

channel作为goroutine间通信和同步的重要途径,是Go runtime层实现CSP并发模型重要的成员。在不理解底层实现时,经常在使用中对channe相关语法的表现感到疑惑,尤其是select case的行为。因此在了解channel的应用前先看一眼channel的实现。 Channel内存布局 channel是go的内置类型,它可以被存储到变量中,可以作为函数的参数或返回值,它在r

Go 数组赋值问题

package mainimport "fmt"type Student struct {Name stringAge int}func main() {data := make(map[string]*Student)list := []Student{{Name:"a",Age:1},{Name:"b",Age:2},{Name:"c",Age:3},}// 错误 都指向了最后一个v// a

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

Go语言构建单链表

package mainimport "fmt"type ListNode struct {Val intNext *ListNode}func main() {list := []int{2,4,3}head := &ListNode{Val:list[0]}tail := head //需要头尾两个指针for i:=1;i<len(list);i++ {//方法一 数组直接构建链表tai