【问题标题】:Javascript date differs based on month format [duplicate]Javascript日期因月份格式而异[重复]
【发布时间】:2017-09-15 11:54:09
【问题描述】:

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

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 输入获得相同的结果?

附言我必须支持严格模式

【问题讨论】:

  • 根据现有的日期逻辑,如果您违反预期的格式,它似乎不会将值从您的 UTC 转换为您的本地时区。所以 '2017-05-19' 是正确的格式 'yyyy-mm-dd' 转换为您当地的时区。这有帮助吗?
  • @PansulBhatt——根据ECMA–262,格式为 YYYY-MM-DD 的日期应被视为 UTC,而不是本地(但当然并非所有使用的浏览器都这样做)。跨度>

标签: javascript date


【解决方案1】:

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

【讨论】:

  • 仍在尝试将字符串解析为值的逻辑,然后创建另一个字符串供另一个解析器解析。为什么不解析它 once 并将值直接提供给 Date 构造函数?请注意您的第一句话:“不鼓励使用 Date 构造函数来解析日期”。 ;-)
  • @RobG 公平点。我添加了一个附录。
猜你喜欢
  • 2013-04-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多