【译】当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时间的午夜
  • 当时区很重要时,一定要检查日期字符串的解析方式。
  • 对于过滤器,最好显式地用年/月/日来构造日期,或者附加本地时间。
posted @ 2025-07-30 13:21  talentzemin  阅读(7)  评论(0)    收藏  举报