Golang如何进行时间计算_time Add与Sub使用方法
技术百科
P粉602998670
发布时间:2026-01-21
浏览: 次 Go 的 time.Time 不可变,Add 和 Sub 是最安全的时间计算方法:Add 用于物理时间偏移(如 24*time.Hour),Sub 返回纳秒级 Duration 差值;AddDate 才适用于年/月/日的日历语义增减,避免混用导致漂移;需警惕零值、时区和指针解引用问题。
Go 的 time.Time 本身不可变,所有时间计算都返回新值,Add 和 Sub 是最常用、最安全的两个方法——别试图修改原时间变量。
用 Add 加减固定时长(time.Duration)
Add 接收一个 time.Duration,返回一个新的 time.Time。它不关心时区或夏令时跳变,纯粹是“物理时间偏移”。
- 正数
Duration向后推,负数向前拉 - 常见写法:
time.Hour、24 * time.Hour、time.Second * 30 - 不能传入年/月这种不固定长度的单位(比如“加1个月”可能有28/30/31天)
now := time.Now()
tomorrow := now.Add(24 * time.Hour)
twoHoursAgo := now.Add(-2 * time.Hour)
fmt.Println(tomorrow.Format("2006-01-02 15:04"))
// 输出类似:2025-06-12 14:22用 Sub 计算两个时间点的差值(返回 time.Duration)
Sub 是唯一能直接得到两个时间点间隔的方法,结果是 time.Duration 类型,单位为纳秒(但可转成秒、小时等)。
-
t1.Sub(t2)等价于t1 - t2,结果为正表示t1在t2之后 - 结果可能为负,注意业务逻辑是否允许(比如倒计时场景需取绝对值)
- 跨时区计算仍准确——
Sub基于 Unix 时间戳(UTC),自动对齐
start := time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC) end := time.Date(2025, 1, 1, 12, 30, 0, 0, time.UTC) dur := end.Sub(start) // 2h30m fmt.Println(dur.Hours()) // 2.5 fmt.Println(int64(dur / time.Second)) // 9000
别混淆 AddDate:它专用于年/月/日的语义化增减
如果要“加1个月”或“减2年”,必须用 AddDate,而不是 Add(30 * 24 * time.Hour)——后者不处理月份天数差异和闰年。
-
AddDate(years, months, days)按日历规则调整,比如 1 月 31 日 + 1 个月 → 2 月 28 日(或 29 日) -
Add和AddDate不能互相替代;混用会导致时间漂移(尤其在月末) - 没有
SubDate,减法用AddDate(-y, -m, -d)
t := time.Date(2025, 1, 31, 0, 0, 0, 0, time.UTC) nextMonth := t.AddDate(0, 1, 0) // 2025-02-29(闰年) // 错误示范:t.Add(30 * 24 * time.Hour) → 2025-03-02(跳过整个 2 月)
容易踩的坑:时区与零值、指针解引用
看似简单的方法,实际出错常因忽略底层细节:
-
time.Time{}是零值(1 年 1 月 1 日 UTC),对它调用Add或Sub不报错但
结果无意义
- 从数据库或 JSON 解析可能得到零值时间,建议用
t.IsZero()预检 - 若变量是
*time.Time,记得先解引用再调用方法:tPtr.Add(...)而非(*tPtr).Add(...)(Go 允许前者,但易误读) -
Sub结果是Duration,不是Time;反过来想“某时间点前 5 分钟”得用t.Add(-5 * time.Minute),不是t.Sub(5 * time.Minute)(语法错误)
时间计算的复杂性不在 API,而在你是否清楚自己要的是“物理偏移”还是“日历偏移”,以及是否意识到零值、时区、闰秒这些隐含前提。
# 的是
# 意识到
# 而在
# 个月
# 适用于
# 你是否
# 能有
# js
# json
# go
# golang
# 指针
# 数据库
# unix
# 结果是
# 月末
# 误读
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- mac怎么打开终端_MAC终端Terminal使用
- Python装饰器设计思路_功能增强机制说明【指导
- Win10如何卸载Skype_Win10卸载Sky
- Win11怎么关闭自动调节亮度_Windows11
- Win11怎么关闭任务栏小组件_Windows11
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- 如何在 ACF 中正确更新嵌套多层 Group 字
- 如何在Windows中创建新的用户账户?(标准与管
- Windows系统时间服务错误_W32Time服务
- C++如何获取CPU核心数?(std::threa
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- Win10怎么创建桌面快捷方式 Win10为应用创
- php中::能访问全局变量吗_全局作用域与类作用域
- Win11怎么设置默认邮件客户端 Win11修改M
- Windows11怎样开启游戏模式_Windows
- Win10怎样卸载TeamViewer_Win10
- 为什么Go建议使用error接口作为错误返回_Go
- C++中的constexpr和const有什么区别
- Python对象生命周期管理_创建销毁说明【指导】
- 如何在Golang中实现服务熔断与限流_Golan
- Win11如何设置自动关机 Win11定时关机命令
- Windows10系统更新错误0x80070002
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win11输入法切换快捷键怎么改_Windows
- C++如何解析JSON数据?(nlohmann/j
- Win11怎么关闭自动更新 Win11永久关闭系统
- Win11怎样安装企业微信_Win11安装企业微信
- C#如何在一个XML文件中查找并替换文本内容
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- 小程序里php怎么变mp4_小程序调用php生成m
- 如何在Golang中使用log包输出不同级别日志_
- 如何从 Go 的 map[string]inter
- php485返回数据不完整怎么办_php485数据
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11怎么压缩文件 Win11自带压缩解压功能
- Python路径拼接规范_跨平台处理说明【指导】
- Windows怎样关闭开始菜单广告_Windows
- Windows驱动无法加载错误解决方法_驱动签名验
- Python数据挖掘进阶教程_分类回归与聚类案例解
- Windows10蓝屏代码DPC_WATCHDOG
- 微信里的php文件怎么变mp4_微信接收php转m
- 如何使用Golang捕获测试日志_Golang t
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Laravel 查询 JSON 列:高效筛选包含数
- Win11如何关闭小娜Cortana Win11禁
- Win11怎么设置默认终端应用_Windows11
- PythonPandas数据分析项目教程_时间序列
- php中常量能用::访问吗_类常量与作用域操作符使


QQ客服