0

0

Golang如何进行时间计算_time Add与Sub使用方法

P粉602998670

P粉602998670

发布时间:2026-01-21 09:48:34

|

644人浏览过

|

来源于php中文网

原创

Go 的 time.Time 不可变,Add 和 Sub 是最安全的时间计算方法:Add 用于物理时间偏移(如 24*time.Hour),Sub 返回纳秒级 Duration 差值;AddDate 才适用于年/月/日的日历语义增减,避免混用导致漂移;需警惕零值、时区和指针解引用问题。

golang如何进行时间计算_time add与sub使用方法

Go 的 time.Time 本身不可变,所有时间计算都返回新值,AddSub 是最常用、最安全的两个方法——别试图修改原时间变量。

Add 加减固定时长(time.Duration

Add 接收一个 time.Duration,返回一个新的 time.Time。它不关心时区或夏令时跳变,纯粹是“物理时间偏移”。

  • 正数 Duration 向后推,负数向前拉
  • 常见写法:time.Hour24 * time.Hourtime.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"))
// 输出类似:2024-06-12 14:22

Sub 计算两个时间点的差值(返回 time.Duration

Sub 是唯一能直接得到两个时间点间隔的方法,结果是 time.Duration 类型,单位为纳秒(但可转成秒、小时等)。

  • t1.Sub(t2) 等价于 t1 - t2,结果为正表示 t1t2 之后
  • 结果可能为负,注意业务逻辑是否允许(比如倒计时场景需取绝对值)
  • 跨时区计算仍准确——Sub 基于 Unix 时间戳(UTC),自动对齐
start := time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC)
end := time.Date(2024, 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)——后者不处理月份天数差异和闰年。

妙笔工坊
妙笔工坊

妙笔工坊是一个集短剧解说,AI视频生成,口播数字人,小说推文生成的ai智能工具

下载

立即学习go语言免费学习笔记(深入)”;

  • AddDate(years, months, days) 按日历规则调整,比如 1 月 31 日 + 1 个月 → 2 月 28 日(或 29 日)
  • AddAddDate 不能互相替代;混用会导致时间漂移(尤其在月末)
  • 没有 SubDate,减法用 AddDate(-y, -m, -d)
t := time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)
nextMonth := t.AddDate(0, 1, 0) // 2024-02-29(闰年)
// 错误示范:t.Add(30 * 24 * time.Hour) → 2024-03-02(跳过整个 2 月)

容易踩的坑:时区与零值、指针解引用

看似简单的方法,实际出错常因忽略底层细节:

  • time.Time{} 是零值(1 年 1 月 1 日 UTC),对它调用 AddSub 不报错但结果无意义
  • 从数据库或 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,而在你是否清楚自己要的是“物理偏移”还是“日历偏移”,以及是否意识到零值、时区、闰秒这些隐含前提。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

212

2025.06.17

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号