Go 语言的 time 包是标准库中超级强劲且常用的包,用于处理时间、日期、时区、定时器、延时等操作。
一、获取当前时间
now := time.Now()
fmt.Println(now) // 输出:2025-11-07 17:05:30.123456789 +0800 CST m=+0.000000001
- time.Now() 返回本地时间(基于系统时区)。
- 结果包含纳秒精度和单调时钟(用于计算时间差,不受系统时间调整影响)。
二、创建指定时间
1. 使用 time.Date
t := time.Date(2025, time.November, 7, 17, 10, 0, 0, time.UTC)
fmt.Println(t) // 2025-11-07 17:10:00 +0000 UTC
参数顺序:年、月、日、时、分、秒、纳秒、时区。
注意:月份使用 time.January ~ time.December 常量(从 1 开始)。
2. 解析字符串时间(Parse)
layout := "2006-01-02 15:04:05"
str := "2025-11-07 17:10:00"
t, err := time.Parse(layout, str)
if err != nil {
panic(err)
}
fmt.Println(t)
⚠️ Go 的时间格式化模板是固定的:“Mon Jan 2 15:04:05 MST 2006”,对应 Unix 时间 1136239445。常见布局常量:
- time.RFC3339 → “2006-01-02T15:04:05Z07:00”
- time.ANSIC → “Mon Jan _2 15:04:05 2006”
三、格式化输出时间(Format)
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05")) // 自定义格式
fmt.Println(now.Format(time.RFC3339)) // RFC3339 标准
fmt.Println(now.Format("2006/01/02")) // 年/月/日
注意:必须用 Go 的“魔法时间”作为模板,不能用 %Y-%m-%d 这类 C 风格。
四、时区处理
1. 获取时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
loc = time.UTC
}
2. 转换时区
utcTime := time.Now().UTC()
shanghaiTime := utcTime.In(loc)
fmt.Println(shanghaiTime)
3. 创建带时区的时间
t := time.Date(2025, 11, 7, 17, 0, 0, 0, loc)
五、时间比较与计算
1. 比较
t1 := time.Now()
t2 := t1.Add(2 * time.Hour)
fmt.Println(t1.Before(t2)) // true
fmt.Println(t1.After(t2)) // false
fmt.Println(t1.Equal(t2)) // false
2. 时间差(Duration)
duration := t2.Sub(t1) // 返回 time.Duration
fmt.Println(duration) // 2h0m0s
fmt.Println(duration.Hours()) // 2
fmt.Println(duration.Minutes()) // 120
3. 加减时间
t := time.Now()
t1 := t.Add(10 * time.Minute)
t2 := t.AddDate(0, 0, -1) // 减一天(注意:AddDate 更适合日历运算)
✅ 推荐:跨月/年/日的计算用 AddDate,避免 Add(24*time.Hour) 在夏令时出错。
六、定时器与延时(并发相关)
1. time.Sleep
time.Sleep(2 * time.Second)
2. time.Timer(单次触发)
timer := time.NewTimer(2 * time.Second)
<-timer.C // 阻塞等待 2 秒
可撤销:
if !timer.Stop() {
<-timer.C // 防止内存泄漏
}
3. time.Ticker(周期性触发)
ticker := time.NewTicker(1 * time.Second)
go func() {
for t := range ticker.C {
fmt.Println("Tick at", t)
}
}()
time.Sleep(5 * time.Second)
ticker.Stop() // 必须 Stop,否则 goroutine 泄漏
七、Unix 时间戳
now := time.Now()
// 转时间戳
unix := now.Unix() // 秒级
unixNano := now.UnixNano() // 纳秒级
// 从时间戳恢复
t := time.Unix(unix, 0)
t2 := time.Unix(0, unixNano)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


