时间处理

Go 标准库使用 time 包处理时间。

一、当前时间

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now)
}

二、格式化时间

Go 的时间格式化比较特殊,不使用 YYYY-MM-DD

它使用固定参考时间:

2006-01-02 15:04:05

示例:

now := time.Now()
text := now.Format("2006-01-02 15:04:05")

fmt.Println(text)

记忆方式:

2006 01 02 15 04 05

三、解析时间

text := "2026-06-07 12:30:00"

t, err := time.Parse("2006-01-02 15:04:05", text)
if err != nil {
	fmt.Println("解析失败:", err)
	return
}

fmt.Println(t)

注意:time.Parse 默认按 UTC 解析。

四、按本地时区解析

loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
	fmt.Println(err)
	return
}

t, err := time.ParseInLocation("2006-01-02 15:04:05", text, loc)
if err != nil {
	fmt.Println(err)
	return
}

fmt.Println(t)

五、时间加减

now := time.Now()

tomorrow := now.Add(24 * time.Hour)
yesterday := now.Add(-24 * time.Hour)

fmt.Println(tomorrow)
fmt.Println(yesterday)

六、时间差

start := time.Now()

time.Sleep(100 * time.Millisecond)

cost := time.Since(start)
fmt.Println(cost)

常用于统计接口耗时。

七、Unix 时间戳

now := time.Now()

fmt.Println(now.Unix())      // 秒
fmt.Println(now.UnixMilli()) // 毫秒

时间戳转时间:

t := time.Unix(1710000000, 0)
fmt.Println(t)

八、定时器

timer := time.NewTimer(time.Second)
<-timer.C

fmt.Println("1 秒后执行")

周期执行:

ticker := time.NewTicker(time.Second)
defer ticker.Stop()

for i := 0; i < 3; i++ {
	<-ticker.C
	fmt.Println("tick")
}

九、使用建议

  • 时间格式化记住 2006-01-02 15:04:05
  • 存储和接口传输建议明确时区。
  • 服务端内部常用 UTC,展示时再转换时区。
  • 统计耗时用 time.Since(start)