
本文介绍在 Go 语言中准确获取昨日日期的两种主流方法:AddDate() 和 Add(),重点说明为何 AddDate(0, 0, -1) 是更可靠的选择,并提供可直接运行的示例代码与关键注意事项。
本文介绍在 go 语言中准确获取昨日日期的两种主流方法:`adddate()` 和 `add()`,重点说明为何 `adddate(0, 0, -1)` 是更可靠的选择,并提供可直接运行的示例代码与关键注意事项。
在 Go 中获取昨日的 time.Time 值,最推荐且语义清晰的方式是使用 time.Time.AddDate() 方法:
package main
import (
"fmt"
"time"
)
func main() {
yesterday := time.Now().AddDate(0, 0, -1)
fmt.Printf("Yesterday: %s\n", yesterday.Format("2006-01-02"))
// 输出示例:Yesterday: 2024-06-14
}
AddDate(years, months, days) 按日历逻辑进行偏移——它会自动处理月份天数差异(如从 3 月 31 日减 1 天得到 3 月 30 日;从 2 月 29 日(闰年)减 1 天得到 2 月 28 日),并尊重时区信息,因此结果稳定、可预测。
另一种写法是使用 time.Add():
yesterdayByAdd := time.Now().Add(-24 * time.Hour)
⚠️ 注意:此方式存在潜在风险。它基于固定 24 小时(即 86400 秒)回退,不考虑夏令时(DST)切换。例如,在实行夏令时的地区(如美国东部时间),若今日恰好是 DST 开始日( clocks spring forward),Add(-24*time.Hour) 可能跳过某个小时,导致返回的时间并非严格意义上的“昨日同一时刻”;反之在 DST 结束日(clocks fall back),可能重复某个小时,造成歧义。
✅ 最佳实践总结:
- 优先使用 t.AddDate(0, 0, -1) 获取“日历上的昨天”,语义明确、时区安全、无 DST 副作用;
- 避免用 Add(-24*time.Hour) 表达“日期偏移”,除非你明确需要基于精确秒数的倒推(如计算滑动窗口时间戳);
- 若需格式化输出,务必调用 Format() 并指定布局字符串(如 "2006-01-02"),避免依赖默认 String() 输出的冗长格式。











