【译】当JavaScript擅自决定我的一天从早上9点开始
原文 https://senhongo.com/blog/when-javaScript-decided-my-day-starts-at-9am
一句话总结:
new Date('2000-01-01') 会创建一个UTC时间的午夜日期,而非本地时间。在日本(UTC+9时区),这意味着时间会变成2000年1月1日09:00:00,因此我们的仪表盘过滤器漏掉了所有早上9点前产生的数据。
问题所在
我们在为管理仪表盘获取数据时发现了件怪事:所有早上9点前创建的记录都不见了!
我们的日期过滤器很简单:
<input type="date" />
它会输出一个简单的字符串,比如:
const minDateString = '2000-01-01';
于是我们把它套进Date构造函数里,在过滤器中进行比较:
new Date(minDate) < item.date && item.date < new Date(maxDate);
这能有多难呢?可偏偏就出了问题……
问题原因
我知道new Date('YYYY-MM-DD')会把时间设为午夜,但我不知道的是,它设的是UTC时区的午夜。
对于日本(UTC+9)来说,这个日期实际上会变成2000-01-01T09:00:00+09:00。
所以当我们说“大于1月1日”时,实际上表达的是“大于1月1日早上9点”。因此,从午夜到8点59分59秒之间创建的所有数据都被排除在外了。
解决办法
不要让new Date()默认使用UTC时间,而是明确将其设置为午夜。(顺便说一下,我们还把最大日期范围设为第二天的前1毫秒。)
const minDate = new Date(`${minInputDate}T00:00:00`);
const maxDate = new Date(`${maxInputDate}T23:59:59.999`);
经验教训
new Date('YYYY-MM-DD')→ UTC时间的午夜- 当时区很重要时,一定要检查日期字符串的解析方式。
- 对于过滤器,最好显式地用年/月/日来构造日期,或者附加本地时间。

浙公网安备 33010602011771号