date.getMonth() 是两个月的

date.getMonth() is two months off

提问人:Kumar Desai 提问时间:3/23/2023 最后编辑:tadmanKumar Desai 更新时间:3/23/2023 访问量:87

问:

let date = new Date('2020-04');
let month = date.getMonth() + 1;

这是给我三月而不是四月,这是 1 个月的假期,这是为什么?

如果我使用:

let date = new Date('2020-04');
month = date.getUTCMonth() + 1;

然后我得到了正确的答案。我在加利福尼亚。无论用户身在何处,我都需要答案是正确的。即我需要四月作为正确答案。

JavaScript 日期

评论

0赞 mykaf 3/23/2023
javascript 中的月份是从零开始的。0 = 1 月;11 = 12 月。
0赞 tadman 3/23/2023
@mykaf 请注意代码中的 。+1
0赞 Hostile Amigo 3/23/2023
我无法复制此错误。当我运行您的第一个代码时,我得到一个“月”值 4。你能仔细检查你正在打印的内容吗?
1赞 tadman 3/23/2023
@HostileAmigo 某人处于零或正 UTC 偏移量。
1赞 Brad 3/23/2023
必修:youtube.com/watch?v=tyKeE3fBEsM

答:

6赞 tadman 3/23/2023 #1

这将创建一个 UTC 日期:

let date = new Date('2020-04');
// 2020-04-01T00:00:00.000Z

请注意“UTC”或“无偏移量”的含义。00.000Z

这将在您的本地时区中获取:

let month = date.getMonth() + 1;

如果你在格林威治标准时间线以西,你会得到一个略低的值,它将在该日期之前 X 小时,但如果你在东边,那就没问题了。

您的 UTC 解决方案是正确的,因为您需要从 UTC 日期开始的 UTC 月份。另一种方法是指定一个包含时区的时间,如下所示:

let date = new Date('2020-04-01:00:00:00-0700');
// 2020-04-01T07:00:00.000Z

您可以看到 UTC 偏移量的位置现在显示为 07:00,而不是 00:00。 现在返回 .getMonth()3

评论

0赞 Kumar Desai 3/23/2023
好的,好吧,我只使用UTC解决方案。谢谢。
0赞 steev 3/23/2023 #2

在 JavaScript 中,Date 对象受用户本地时区的影响。当您创建新的 Date 对象时,如下所示:new Date('2020-04'),它将被解释为位于用户的本地时区。由于您位于加利福尼亚州,因此它使用的是太平洋时间 (PT)。

在这种情况下,由于夏令时,日期会受到时区偏移量的影响。4 月,加利福尼亚州采用太平洋夏令时 (PDT),即 UTC-7,因此当您在午夜创建日期时,它实际上比 UTC 晚 7 小时。这意味着,在 UTC 中,它仍然是 3 月 31 日 17:00。

但是,当您调用 getUTCMonth() 时,它会返回基于 UTC 的月份,即 4 月。由于您希望无论用户身在何处,答案都是正确的,因此您可以继续使用 getUTCMonth() + 1。