go的time包基于time.Time和time.Duration类型,通过固定参考时间"Mon Jan 2 15:04:05 MST 2006"定义layout进行时间解析与格式化,使用time.Now()、time.date()、time.Parse()创建时间,format()输出,Add()、Sub()、Before()、After()、Equal()完成计算比较,推荐显式指定时区如UTC或LoadLocation,并用unix()等方法处理时间戳,避免精度丢失。

Go 的 time 包是处理时间最核心、最常用的工具,它不依赖系统时区配置,所有操作都基于 time.Time 类型和 time.Duration 类型,清晰、安全、不易出错。
创建和解析时间
Go 中时间必须显式创建,不能像字符串那样直接赋值。常用方式有:
-
time.Now():获取当前本地时间(带时区信息) -
time.Date(year, month, day, hour, min, sec, nsec, loc):按字段构造时间,month是time.Month类型(如time.January),loc通常用time.Local或time.UTC -
time.Parse(layout, value):按固定 layout 解析字符串。注意:Go 的 layout 不是格式化符号(如 yyYY-MM-DD),而是用 参考时间"Mon Jan 2 15:04:05 MST 2006"的对应位置来定义——这是 Go 唯一且必须记住的模板
例如:time.Parse("2006-01-02 15:04:05", "2024-05-20 10:30:45") 可正确解析;而用 "YYYY-MM-DD" 会失败。
格式化输出时间
用 t.Format(layout) 将 time.Time 转为字符串。layout 规则同上,仍基于参考时间:
立即学习“go语言免费学习笔记(深入)”;
-
t.Format("2006-01-02")→"2024-05-20" -
t.Format("2006/01/02 15:04:05")→"2024/05/20 10:30:45" - 预定义常量更省心:
t.Format(time.RFC3339)→"2024-05-20T10:30:45+08:00",适合 API 传输
时间计算与比较
时间运算通过 Duration 类型完成,它是纳秒级整数,支持加减:
-
t.Add(24 * time.Hour):加一天 -
t.Add(-7 * 24 * time.Hour):减一周 -
t.Sub(otherTime):返回Duration,表示两时间间隔 - 比较用
==、Before()、After()、Equal()(注意:带时区的时间比较才真正有意义)
⚠️ 避免用 t1.Unix() == t2.Unix() 判断相等——会丢失纳秒精度,应直接用 t1.Equal(t2)。
时区与时间戳处理
Go 默认使用本地时区,但推荐显式指定以避免歧义:
-
time.Now().In(time.UTC):转为 UTC 时间 -
time.Now().In(loc):转到指定时区,可用time.LoadLocation("Asia/Shanghai")加载标准时区 - Unix 时间戳转换:
time.Unix(sec, nsec)构造时间;t.Unix()或t.UnixMilli()获取对应整数 - 数据库或 jsON 场景中,常配合
json.Marshal使用time.Time的默认 RFC3339 格式,或自定义MarshalJSON方法统一为毫秒时间戳
基本上就这些。time 包设计克制,没有“昨天”“下个月”这类模糊方法,靠组合基础操作实现逻辑,看似多写几行,实则稳定可控。