Go语言中“糟糕”的日期时间格式化设计

趁着周末的闲暇时间,着手对许久未更新维护的hugo-theme-next主题进行相关Issues的修复和优化,其中有块与文章更新时间相关的u问题: #109 ,修复时正好发现配置文件中的日期时间格式化有点不宜理解,本来想对它做下调整改进,但却是结果遇到莫明奇妙的错误,深入了解一番才发现,这是Go语言的设计规范要求。好吧,也很是无奈啦。顺便也记录下对于Go语言中日期时间格式化的一些学习和理解,方便后续使用本主题用户阅读与参考。

与其他编程语言不同的是,在Go语言中对日期时间的格式处理,是使用的特定一组数字来代表,而不是大家平时所常见到的yyyyMMddHHmmss等。在Go语言中使用2006-01-02 15:04:05这个时间模板作为格式化依据,其中各部分数字对应的含义说明参考如下:

模板部分说明示例
20064位数年份2024
062位数年份(最后两位)24
01月份(用两位数表示,1月)01
1月份(用一位数表示)1
02日(用两位数表示,2号)02
2日(用一位数表示)2
15小时(24小时制)15
03小时(12小时制,前面补零)03
3小时(12小时制,不补零)3
04分钟(两位数)04
05秒(两位数)05
PM上下午PM
pm上下午(小写)pm
-07:00时区偏移-08: 00
MST时区名UTC

不过Go语言对于日期时间格式化的这种设计风格,确实有些令人无语,但只能是自己慢慢理解和适应。可以尝试通过掌握以下几点会帮助更快适应:

  • 记住基础时间2006-01-02 15:04:05,它是所有模板的起点;
  • 使用24小时制时,用15表示;使用12小时制时,用03表示;
  • 要加上AM/PM时,用大写或小写的PM
  • 时区信息用 -07:00 表示偏移,用 MST 表示缩写。
  • **最重要的:**模板中的数字部分不能任意乱写,只能调整顺序或是连接符号;
另外在 Go语言官方文档 中有对日期时间格式常用模板的描述,有需要使用的小伙伴可以自行翻阅一下。

参考上面对Go语言日期时间格式化的学习,将本站点的日期和时间模板更新为中国标准时区的24小时制,配置如下:

1
2
3
4
5
6
7
8

# 年,月,日及时间的格式化样式
# Format style for year,month,date & time
yearFormat: "2006"
monthFormat: "01月02日"
dateFormat: "2006年01月02日"
# CST (China Standard Time)
timeFormat: "2006年01月02日 15:04:05 CST"