hugo / go 模版中的日期格式

hugo / go

最近想自己做一个 hugo 的主题,结果第一天就卡关,看似很简单的日期时间显示就卡壳了很久, 现在分享一下,如何在 hugo 的模版中正常的显示日期时间

1 环境

本问题应该与 go 模版对日期的处理方法有关,所以如果使用到任何版本的 go 或 hugo 都可能遇到。

2 问题

首先我们日期的数据是这样子的

2019-07-13 11:43:05 +0800 CST

在 hugo 的模版中,我们一般可以用以下形式来格式化显示时间

{{ .Date.Format "Sun, Feb 11, 2018" }}

此日期格式来自这里,是不是很酷:给定一个范例,hugo就可以举一反三出日期格式, 注意形式是这个样子没错,但是实际这并不能正确显示时间,hugo 解析后,我们会得到以下结果

Sun, Feb 77, 13078

这是一个非常让人迷茫的结果,最早我认为是引用网页举例错了,于是自己整理了一下日期格式

{{ .Date.Format "2019-07-13" }}

结果如下

13079+08-711

现在比较让人怀疑的是 hugo 的解析错误或是使用不当了。

3 解决

站在事后我们去看这个问题,我们更清楚为什么会是当前的情况,如果以 hugo date format error 这些关键字去搜索的话,基本是没办法找到我们想要的结果的,因为这不是一个错误,是设计如此。 这篇文章详细地以试错的方法讨论了这个问题,我们才知道, 必须以 2006年1月2日3时4分5秒 周一 下午 的格式 去描述时间的格式,hugo / go 才能正常解析我们给定的日期格式, 所以如果要描述 Sun, Feb 11, 2018 的格式,需要写成以下形式

{{ .Date.Format "Mon, Jan 02, 2006" }}

同理 2019-07-13 需要写成以下形式

{{ .Date.Format "2006-01-02" }}

是不是觉得顿时没有那么神奇了,那么为什么是 2006 年呢,我想有两个原因

  1. 2006年1月2日 是周一
  2. 既然月日时分秒是12345了,那么年要么是 0,要么是 6 了,而 6 正好满足第一条

当然以上只是我的猜测,完整的对应关系,上面提到的引用文章里有描述, 或者简单一点,只要记得以下一段即可

{{ .Date.Format "2006-01-02 03:04:05 PM Z0700" }}
{{ .Date.Format "06 Jan 02 Mon 15:04:05" }}

当知道这个规律后,我们再去推导之前令人迷茫的两个输出结果,是不是就不再迷茫了。

4 结论

日期时间格式可能是每一个 go 程序员都遇到过的问题,但是对于一个 hugo 使用者来说, 未免不太友好,如果你正在为这个问题烦恼,希望本文会对你有所帮助。