golang 时间戳获取、类型转换、时间比较
获取当前时间、秒级时间戳
time.Now()// 获取当前时间,类型为time.Time
time.Unix()// 获取当前时间的秒级时间戳,时间戳的起始时间是2006-01-02 15:04:05,go语言的诞生时间
获取任意时间的秒级时间戳
t.Unix()// 获取秒级时间戳
时间、时间戳转换为字符串
时间转时间字符串
timeStr := time.Now().Format("2006-01-02")
时间戳转时间字符串
timeTemplate1 := "2006-01-02 15:04:05"
t := int64(1546926630) //外部传入的时间戳(秒为单位),必须为int64类型
timeStr := time.Unix(t, 0).Format(timeTemplate1)
特别注意📢
timeTemplate1 := "2006-01-02 15:04:05" 这个时间是固定的,不能是 "2006-01-02 15:04:05" 其他之外的任何日期字符串,日月年、时分秒都不能错,否则转换的时间会错误。但是如果想时间精确粒度粗一些,可以把后半段进行截断,比如 "2006-01-02"(精确到天), "2006-01-02 15"(精确到小时)、"2006-01-02 15:04"(精确到分钟)
来自chatgpt 的解释
这个特定的日期时间,因为在 Go 语言中,这是一个预定义的时间布局。
这个奇怪的日期 "2006-01-02 15:04:05" 其实是有意义的。Go决定使用这个特定的日期,因为这个日期包含了所有的时间相关的数字:1到12的月份,1到31的日期,0到23的小时,0到59的分钟和秒,包括4位年份(2006表示4位年份)。
这个规则让你可以选择一个合适的布局字符串来格式化你的时间,但是布局字符串中的日期和时间部分必须符合参考的时间布局 "2006-01-02 15:04:05"。所以不可以把 "2006-01-02 15:04:05" 换成 "2016-01-02 15:04:10"。
字符串转时间对象
方式一
time.ParseInLocation()转换成本地时区的时间
timeTemplate1 := "2006-01-02 15:04:05"
t1 := "2019-01-08 13:50:30" //外部传入的时间字符串
t1_time, _ := time.ParseInLocation(timeTemplate1, t1, time.Local) //使用parseInLocation将字符串格式化返回本地时区时间
方式二
如果调用 time .parse() 会相差 8小时。默认时区是utc
time1 := "2015-03-20 08:50:29"
t1, err := time.Parse("2006-01-02 15:04:05", time1)
参考: golang的time包:时间字符串和时间戳的相互转换
字符串转时间戳
先转成时间对象,然后获取秒级时间戳
timeTemplate1 := "2006-01-02 15:04:05"
t1 := "2019-01-08 13:50:30" //外部传入的时间字符串
t1_time, _ := time.ParseInLocation(timeTemplate1, t1, time.Local) //使用parseInLocation将字符串格式化返回本地时区时间
timestamp := t1_time.unix()
时间对象(time.Time)的比较
Before, After, Equal,分别对应<,>,==
t1.Before(t2)// t1 < t2
t1.After(t2)// t1 > t2
t1.Equal(t2)// t1 == t2
参考:golang比较时间大小
当前时间加1分钟
time.ParseDuration()函数参数的有效时间单位为“ns”、“us”(或“µs”)、“ms”、“s”、“m”、“h”。该函数返回一个 Duration 对象,配合time的Add()方法使用,可以获取相差指定区间的时间。这个函数假设没有润秒。后面需要验证下会不会有闰年这种考虑。
// 当前时间加一分钟
m, _ := time.ParseDuration("1m")
m1 := time.Now().Add(m)
// 转换成时间字符串
str := m1.Format("2006-01-02 15:04:05")
fmt.Println(str) // 输出:"2019-07-24 14:14:56"
参考: Golang 中的 time.ParseDuration()函数示例
计算时间差
diff := t2.Unix() - t1.Unix() //获得相差的秒数,t1和t2都是time.Time类型
hour = diff / 3600 // 相差的小时数
计算某段程序运行时间
start := time.Now()
time.Sleep(1 * time.Second)
latency := time.Since(start).Milliseconds()
fmt.Printf("latency=%v\n", latency)
或者使用上一个知识点
time.Sleep(1 * time.Second)
end := time.Now()
fmt.Printf("latency=%v\n", end.Unix() - start.Unix()) // 精确到秒
fmt.Printf("latency=%v\n", end.UnixNano() - start.UnixNano()) // 精确到纳秒
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通