外观
时间处理
约 548 字大约 2 分钟
2025-06-19
本文整理 Go 语言中
time包的常用操作,包括时间解析、格式化、时间戳转换等。
时间格式参考值
Go 的时间格式使用固定参考时间来定义格式,而非 % 占位符:
Mon Jan 2 15:04:05 MST 2006即:2006-01-02 15:04:05(星期几月份小时分秒时区年份)
字符串 ↔ 时间
解析字符串为 time.Time
str := "2025-06-29 14:30:00"
t, err := time.Parse("2006-01-02 15:04:05", str)默认时区为 UTC,如需本地时区,使用 ParseInLocation:
t, err := time.ParseInLocation("2006-01-02 15:04:05", str, time.Local)时间格式化为字符串
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-06-29 14:30:00
fmt.Println(now.Format("2006/01/02")) // 2025/06/29
fmt.Println(now.Format("15:04:05")) // 14:30:00
fmt.Println(now.Format("02/01/2006")) // 29/06/2025
fmt.Println(now.Format("2006-01-02T15:04:05Z07:00")) // ISO 8601其他方式创建时间
// 指定年月日时分秒
t := time.Date(2025, 6, 29, 14, 30, 0, 0, time.Local)
fmt.Println(t.Unix()) // Unix 时间戳时间戳互转
// time.Time → Unix 时间戳(秒)
ts := time.Now().Unix()
// Unix 时间戳(秒)→ time.Time
t := time.Unix(ts, 0)
// Unix 纳秒级时间戳 → time.Time
t := time.Unix(0, nanoseconds)时间计算
加减时间
now := time.Now()
// 加 3 天
after3Days := now.AddDate(0, 0, 3)
// 减 2 小时
before2H := now.Add(-2 * time.Hour)
// 等价写法
before2H := now.AddDate(0, 0, 0).Add(-2 * time.Hour)时间差
t1 := time.Date(2025, 1, 1, 0, 0, 0, 0, time.Local)
t2 := time.Date(2025, 6, 29, 14, 30, 0, 0, time.Local)
diff := t2.Sub(t1)
fmt.Println(diff.Hours()) // 总小时数
fmt.Println(diff.Days()) // 总天数
fmt.Println(diff.Minutes()) // 总分钟数判断先后
t1.Before(t2) // t1 是否在 t2 之前
t1.After(t2) // t1 是否在 t2 之后
t1.Equal(t2) // 两个时间是否相同常用时间格式速查
| 格式串 | 含义 | 示例 |
|---|---|---|
2006-01-02 | 日期 | 2025-06-29 |
15:04:05 | 时间 | 14:30:00 |
2006-01-02 15:04:05 | 完整时间 | 2025-06-29 14:30:00 |
2006/01/02 | 斜杠日期 | 2025/06/29 |
01-02-2006 | 月-日-年 | 06-29-2025 |
15:04 | 时分 | 14:30 |
20060102150405 | 紧凑格式 | 20250629143000 |
定时器
// 延时执行一次
time.AfterFunc(3*time.Second, func() {
fmt.Println("3秒后执行")
})
// 周期执行
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for range ticker.C {
fmt.Println(time.Now().Format("15:04:05"))
}