为什么 31-01-2024 和 02-02-2024 的两个 Date() 构造函数返回自纪元以来相同的毫秒数? [重复]

问题描述 投票:0回答:2

我有一个格式为“dd-mm-yyyy”的日期字符串,我想将其转换为毫秒。

let split_date = '31-01-2024'.split('-');
let d = new Date(parseInt(split_date[2]), parseInt(split_date[1]), parseInt(split_date[0]), 0, 0, 0, 0).getTime();
console.log(d);

let split_date2 = '02-02-2024'.split('-');
let d2 = new Date(parseInt(split_date2[2]), parseInt(split_date2[1]), parseInt(split_date2[0]), 0, 0, 0, 0).getTime();
console.log(d2);

这给了我 1709317800000 的输出,这似乎是不正确的。我还得到了“02-02-2024”的相同毫秒值。

为什么毫秒值不正确并且多个日期相同?

javascript date datetime
2个回答
3
投票

new Date(year, month, day)
构造函数中,
month
是从 0 开始的。即一月 = 0,二月 = 1,依此类推。 请参阅文档

所以,

new Date(2024, 1, 31)
实际上试图创造2月31日,这当然不存在。根据内部溢出逻辑,结果是 3 月 2 日(因为 2024 年是闰年,所以非闰年是 3 月 3 日)

当然,在

02-02-2024
上应用代码将调用
new Date(2024, 2, 2)
,这是——遵循
Date
对象的内部逻辑——也是 3 月 2 日......

另请参阅使用您传入的参数创建日期的片段

console.log(new Date(2024, 1, 31, 12));
console.log(new Date(2024, 2, 2, 12))

因此要修复您的代码,您必须从解析的月份中减去

1

let split_date = '31-01-2024'.split('-');
let d = new Date(parseInt(split_date[2]), parseInt(split_date[1]) - 1, parseInt(split_date[0]), 0, 0, 0, 0).getTime();
console.log(d);

2
投票

当使用带有多个参数的

Date
构造函数时,月份应在 0 到 11 之间(而不是 1 到 12 之间)。所以你应该从月份组件中删除 1,这样就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.