POST

日期怎么会变成一长串

踩坑记录 #Hexo #工程

昨天在游戏列表页看到日期渲染成了这样:

1
Sun Oct 18 2026 00:00:00 GMT+0000 (Coordinated Universal Time)

数据文件里我明明写的是 date: 2026-10-18。一个简简单单的日期,怎么就变成了这么长一串。

原因

source/_data/*.yml 里写成不带引号的 2026-10-18,js-yaml 解析的时候会按 YAML 的时间戳类型处理,直接给你一个 Date 对象,而不是字符串。

EJS 的 <%= %> 遇到对象会调 toString()。Date.prototype.toString() 出来的就是上面那一长串。

所以问题不在模板写错了,在于我以为我在处理字符串,其实手里是个 Date。中间隔了一层自动类型转换,谁都没报错。

更麻烦的地方

日期和时间不是一回事。2026-10-18 只有日期粒度,没有时分秒。任何地方显示出「00:00:00」,都是把日期当时间用了——那个零点是假的,是我瞎猜出来的。

首页还有个「近期动态」,聚合的时候用 date.valueOf() 存了毫秒数。这个数字交给模板同样会原样输出,页面上就会出现 1792281600000 这种东西。

怎么修的

统一走一个 helper,把五种输入都归一成 YYYY-MM-DD:纯日期串、Date 对象、毫秒时间戳、带时区的 ISO 串,还有人手写的其他文本。空值和非法值返回空串,不炸。

1
<%= fmtItemDate(it.date) %>

踩到的第二个坑

helper 我一开始放在了项目根的 scripts/ 下面。本地 hexo generate 跑得好好的,测试也全绿。但 Hexo 用 vm 逐个执行 scripts/ 下的文件,子目录里的文件是被当作独立脚本执行的,跨文件 require 会直接解析失败。

结果是构建报了一串错,然后安静地产出了 11 个文件,退出码还是 0。有几个页面直接是 0 字节。

这就是最危险的地方:命令成功了,日志也在刷,但产物是坏的。如果只盯着「构建通过」看,根本发现不了。

规则

现在模板里禁止再出现 <%= new Date(...) %> 和 <%= it.date %> 裸输出,全部走 helper。测试里用 vm 加载 helper,把这几类问题锁死了——包括那个「构建成功但产物是 0 字节」的情况。

顺带一条:以后判断构建有没有成功,不能只看输出,得抽查几个产物的字节数。


日期怎么会变成一长串
https://www.040925.xyz/2026/10/18/date-becomes-machine-string/
作者
hanyaoyu
发布于
2026年10月18日
许可协议

← 回到首页