Javascript日期因月份格式而异

时间:2017-04-19 10:06:21

标签: javascript date

在调试我的应用程序时,我发现了一些奇怪的事情:

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',但如果月号之前为零,则日期不等于零。

如何通过505输入获得相同的结果?

P.S。我必须支持严格模式

1 个答案:

答案 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'));