node.js - 为什么我在 Javascript Date 对象上使用 getDay() 方法和 getUTCDay() 方法时得不到相同的结果
今天是星期一,现在是凌晨00:51。我来自魁北克市,因此我在GMT-0500 (UTC−05:00)时区。
我不知道为什么下面的代码会给我两个不同的结果:
const weekday = Array('sunday', 'monday', 'tuesday', 'wednesday',
'thursday', 'friday', 'saturday');
console.log('getDay() =', weekday[new Date('2019-02-18').getDay()]);
// getDay() = sunday
console.log('getUTCDay() =', weekday[new Date('2019-02-18').getUTCDay()]);
// getUTCDay() = monday
在 MDN 网站上,他们说 getDay() 方法根据本地时间返回指定日期的星期几,其中 0 表示星期日。
他们对于 getUTCDay() 方法也完全一样地说,它根据世界标准时间返回指定日期的星期几,其中 0 表示星期日。
唯一的区别是一个是根据本地时间,另一个是根据世界时间...
我不确定我应该验证什么来理解差异,我在 Node.js(Typescript)和 Chrome DevTools 控制台(Javascript)中都尝试过
在我的电脑设置中,一周的第一天是星期日…
答案#1
new Date(string) 使用 Date.parse() 来解析日期。
来自 Date.parse() 文档:
当时区偏移缺失时,仅日期形式被解释为UTC时间,而日期时间形式被解释为本地时间。
因此,由 new Date('2019-02-18') 创建的日期将在 UTC 时间的 2019 年 2 月 18 日午夜。
如果你所在的时区有负偏移,那么该日期在本地时间实际上是星期天(魁北克市是 GMT-0500,所以该日期在本地时间是 2019-02-17 19:00:00)。
所以如果你处于时区偏移为负的地区,那么 .getDay() 会正确地返回 0 表示星期天,而 .getUTCDay() 会正确地返回 1 表示星期一。