在调试我的应用程序时,我发现了一些奇怪的事情:
new Date('2017-5-19') -> Fri May 19 2017 00:00:00 GMT+0300 (FLE Summer Time)
new Date('2017-05-19') -> Fri May 19 2017 03:00:00 GMT+0300 (FLE Summer Time)
我从字符串设置日期,如'2017-5-19'
,但如果月号之前为零,则日期不等于零。
如何通过5
和05
输入获得相同的结果?
P.S。我必须支持严格模式
答案 0 :(得分:4)
如MDN所示,由于实现差异,不鼓励使用Date构造函数来解析日期。
但是,如果您真的想这样做,唯一的解决方案是确保您提供的输入是一致的。这将确保(至少在单一环境中)输出将保持一致。
让两者都像2017-5-19
一样工作:
function adjustDateString(str) {
return str.split('-').map(Number).join('-');
}
console.log(new Date(adjustDateString('2017-5-19')))
console.log(new Date(adjustDateString('2017-05-19')))
让两者都像2017-05-19
一样工作:
function padTo2Digits(str) {
return str.length >= 2 ? str : '0' + str;
}
function adjustDateString(str) {
return str.split('-').map(padTo2Digits).join('-');
}
console.log(new Date(adjustDateString('2017-5-19')))
console.log(new Date(adjustDateString('2017-05-19')))
编辑但是,正如我在上面指出的那样,你可能会更好,而不是在字符串上使用Date
构造函数。只需将其拆分为其值并将其传递给构造函数:
function parseDate(str) {
var parts = str.split('-').map(Number);
return new Date(parts[0], parts[1], parts[2]);
}
console.log(parseDate('2017-5-19'));
console.log(parseDate('2017-05-19'));
使用数组解构语法(需要ES6 +):
function parseDate(str) {
let [year, month, day] = str.split('-').map(Number);
return new Date(year, month, day);
}
console.log(parseDate('2017-5-19'));
console.log(parseDate('2017-05-19'));