JavaScript与Postgres Epoch时间戳差异原因排查求助
问题根源:JavaScript的月份索引从0开始!
这是JS Date对象最容易踩的坑之一,你的两段代码其实对应的不是同一个日期:
- 在JavaScript中,
new Date(2018, 3, 1)里的月份参数是0-based(从0开始计数)的,所以3对应的是4月,而不是3月!这个日期实际是2018-04-01 00:00:00(时区+2),转换成时间戳1522533600完全正确。 - 而PostgreSQL的
TIMESTAMP WITH TIME ZONE '2018-03-01 00:00:00'明确指定的是3月1日,时区+2下对应的epoch时间1519858800.0也是正确的。
验证一下:
把JS代码改成3月的正确写法,结果就会和PG一致了:
new Date(2018, 2, 1).getTime() / 1000; // 输出:1519858800,和PG的结果完全匹配
额外补充:
如果想避免这种月份索引的混乱,在JS里建议使用ISO格式的字符串来创建日期,比如:
new Date('2018-03-01T00:00:00+02:00').getTime() / 1000; // 同样会得到1519858800
这样就不会再因为月份的0-based索引踩坑啦!
内容的提问来源于stack exchange,提问作者port5432
相关产品推荐
相关产品推荐

