0

0

如何使用Golang time包处理时间_time时间格式化与解析

P粉602998670

P粉602998670

发布时间:2026-01-17 15:17:02

|

817人浏览过

|

来源于php中文网

原创

Go time.Parse 报错根本原因是强制使用固定参考时间“Mon Jan 2 15:04:05 MST 2006”作布局模板,不支持yyyy-MM-dd等任意格式;必须严格匹配字段位置、大小写及时区标识,推荐优先使用time.RFC3339等内置常量。

如何使用golang time包处理时间_time时间格式化与解析

Go time.Parse 为什么总是报 parsing time 错误

根本原因在于 Go 的时间解析不接受任意格式字符串,它强制使用固定参考时间 "Mon Jan 2 15:04:05 MST 2006"(即 Unix 时间戳 0 的人类可读表示)作为布局模板。你写的 "2006-01-02 15:04:05" 是对的,但写成 "yyyy-MM-dd HH:mm:ss""%Y-%m-%d %H:%M:%S" 就会直接 panic。

  • 错误示例:
    time.Parse("yyyy-MM-dd HH:mm:ss", "2024-01-01 12:00:00") // panic: parsing time
  • 正确写法必须严格对应参考时间各字段的位置和大小写:
    time.Parse("2006-01-02 15:04:05", "2024-01-01 12:00:00") // ✅
  • 时区容易被忽略:字符串不含时区信息时,默认按 Local 解析;含 Z+0800 则需在 layout 中显式写 Z-0700
  • 年份用 2006(四位),不是 YYYY;小时用 15(24 小时制),不是 HH

time.Format 输出结果和预期不符怎么办

time.Format 的 layout 规则和 Parse 完全一致,只是方向相反。常见问题不是“不会写”,而是没注意默认时区或忽略了 layout 中空格/标点的字面匹配。

  • 如果你调用 t.Format("2006-01-02 15:04:05") 却得到 UTC 时间,大概率是 t 本身是 UTC 时间(比如从 time.Now().UTC() 或 JSON 反序列化来的),而不是本地时区
  • layout 中所有非占位符字符(如 -:、空格)都会原样输出,所以 "2006/01/02,15:04:05" 会输出 "2024/01/01,12:00:00",逗号不会被忽略
  • 毫秒要写 .000(对应参考时间的 .999999999 的前三位),微秒是 .000000,纳秒是 .000000000
  • 星期几用 MondayMon,不能用 yyyy-MM-dd EEE —— Go 没有这种简写别名

处理带时区的时间字符串(如 RFC3339、ISO8601)

Go 内置了多个标准 layout 常量,比手写更安全。优先用 time.RFC3339time.RFC3339Nanotime.ISO8601(Go 1.20+),而不是自己拼 "2006-01-02T15:04:05Z07:00"

白瓜AI
白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载
  • time.RFC3339 对应 "2006-01-02T15:04:05Z07:00",能正确解析 "2024-01-01T12:00:00+08:00""2024-01-01T04:00:00Z"
  • time.RFC3339Nano 支持纳秒精度,如 "2024-01-01T12:00:00.123456789+08:00"
  • 注意:time.ISO8601(Go 1.20 起)不带时区偏移,只支持 "2006-01-02" 这种日期,不是完整 ISO8601;完整带时区的 ISO8601 应仍用 RFC3339
  • 解析失败时,err 通常包含具体不匹配位置,比如 parsing time "2024-01-01T12:00" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "Z07:00",说明缺时区

time.ParseInLocation 需要手动指定时区的典型场景

当输入字符串明确属于某个时区(如“北京时间 2024-01-01 12:00:00”),但字符串本身不带时区标识(如无 +0800),就必须用 time.ParseInLocation,否则 Go 会按本地时区或 UTC 解析,导致时间值错位。

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

  • 正确做法:
    loc, _ := time.LoadLocation("Asia/Shanghai")
    t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2024-01-01 12:00:00", loc)
  • 不要用 time.FixedZone("CST", 8*60*60) 手动构造——CST 有歧义(美国中部?中国标准?),且 FixedZone 不处理夏令时
  • 如果程序部署在海外服务器,但业务逻辑始终按东八区处理,就一定不能依赖 time.Parse + 环境时区,必须显式传 loc
  • time.LoadLocation 会查系统 tzdata,若容器镜像精简(如 alpine),可能缺失时区数据,需额外安装 tzdata
时区、layout 字面量、解析上下文这三者一旦错配,错误表现往往不直观——比如时间差 8 小时、日期跳变一天、或直接 panic。宁可多写一行 LoadLocation,也不要赌环境时区或 layout 猜测。

相关专题

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

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

178

2024.02.23

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

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

226

2024.02.23

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

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

338

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开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2024.05.21

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

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

196

2025.06.09

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

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

191

2025.06.10

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

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

192

2025.06.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

40

2026.01.16

热门下载

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

精品课程

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

共101课时 | 8.3万人学习

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号