ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Go time 包实战:Ticker、Timer、Date 加减与格式化

2026/9/28 4:29:20 拓冰建站 浏览量
Go time 包实战:Ticker、Timer、Date 加减与格式化 Go time 包实战Ticker、Timer、Date 加减与格式化时间处理业务项目天天见time 包 Go 标准库写得不错但坑点也不少。一、时间类型typeTimestruct{walluint64;extint64;loc*Location}time.Time是值类型但内含指针赋值拷贝会共享 Location。二、Time.Now / Formatnow:time.Now()fmt.Println(now.Format(time.RFC3339))格式化用的不是 strftime是 reference time2006-01-02T15:04:05Z07:00记住Mon Jan 2 15:04:05 MST 2006这个魔数。三、Tickerticker:time.NewTicker(1*time.Second)deferticker.Stop()fort:rangeticker.C{fmt.Println(t)}不能向 channel 写入 nil。四、Timertimer:time.NewTimer(2*time.Second)defertimer.Stop()select{case-timer.C:case-ctx.Done():timer.Stop()}五、Date 加减now:time.Now()tomorrow:now.Add(24*time.Hour)weekAgo:now.Add(-7*24*time.Hour)六、Durationd:5*time.Second100*time.Millisecondtime.Duration int64 纳秒。七、Parset,_:time.Parse(time.RFC3339,2026-07-30T10:00:00Z)八、Locale / Locationimporttime/tzdataloc,_:time.LoadLocation(Asia/Shanghai)fmt.Println(time.Now().In(loc))time/tzdata嵌入 tzdata避免运行时找不到。九、Tick 节流importgithub.com/modern-go/limiterlimiter:limiter.NewTimeLimiter(1*time.Second)limiter.Call(func(){work()})十、时间在日志中的格式化slog.NewJSONHandler(os.Stdout,slog.HandlerOptions{ReplaceAttr:func(groups[]string,a slog.Attr)slog.Attr{ifa.Keyslog.TimeKey{returnslog.String(ts,a.Value.Time().Format(time.RFC3339))}returna},})十一、踩坑清单Time 比较用t1.Before(t2)别用不要把time.Time持久化进 JSON 默认 marshal 而是 string否则序列化浪费注意 ParseInLocation vs Parse十二、性能对比time.Time 比较是常数级。 format / parse 是 O(string len)。十三、企业实战相对时间funcRelative(t time.Time)string{d:time.Since(t)ifdtime.Minute{returnjust now}ifdtime.Hour{returnfmt.Sprintf(%dm ago,int(d.Minutes()))}ifd24*time.Hour{returnfmt.Sprintf(%dh ago,int(d.Hours()))}returnfmt.Sprintf(%dd ago,int(d.Hours()/24))}十四、数据库时间createdAt:time.Now()db.Exec(INSERT INTO ... (created_at) VALUES (?),createdAt)// 扫描回 Gorow.Scan(createdAt)DB 与 Go 都需在 UTC 存储避免时区错乱。十五、未来Go 1.24 计划加入 typed duration literal5s后端类型推断。十六、总结与展望time 包虽复杂但稳定。掌握 Format magic、Timer、Ticker、Location 让项目稳健。未来时序数据库的趋势可能弱化业务层的时间处理。十七、参考文献Go 标准库 timeLayout pattern doc