javascript - 日期 ('2015-1-1' ) 输出不同于日期 (2015-01-01)

标签 javascript node.js date

我刚刚发现如果我使用new Date('2015-1-1'),时间是没有时区影响的,但是如果我使用new Date('2015-01 -01') 时间在 Node.js 中具有时区效果。

我输出 4 Date():

    console.log(new Date('2015-1-1'));
    console.log(new Date('2015-01-1'));
    console.log(new Date('2015-1-01'));
    console.log(new Date('2015-01-01'));

输出是

Thu Jan 01 2015 00:00:00 GMT+0800 (CST)
Thu Jan 01 2015 00:00:00 GMT+0800 (CST)
Thu Jan 01 2015 00:00:00 GMT+0800 (CST)
Thu Jan 01 2015 08:00:00 GMT+0800 (CST)

你可以看到最后时间是 08:00:00 因为我在 +8 时区。

我认为输出取决于月份或日期数字的数字。当它是 10、11 或 12 时,输出总是 08:00:00

我想知道为什么以及是否有更好的方法来处理这个问题,除了手动检查月份和日期数字?

最佳答案

直到并包括 ECMA-262 第 3 版,日期字符串的解析完全依赖于实现。对于 ES5,没有时区的 ISO 8601 格式字符串将被解析为 UTC,但是解析任何其他类型的日期字符串仍然依赖于实现。

对于 ECMAScript 2015,此类没有时区的字符串将被解析为本地字符串(即基于系统设置的偏移量)。

因此,您的 Node.js 实现似乎无法将前 3 个字符串识别为 ISO 8601,因此根据将它们视为 UTC 的其他一些内部逻辑来解析它们。

最后一个字符串被视为符合 ISO 8601 标准,因此被解析为本地字符串。

如果您希望将所有此类字符串解析为本地字符串,您可以使用一个简单的函数,如:

/*  @param {string} s - date string in format yyyy-[m]m-[d]d
**  @returns {Date} - a Date object for the specified date in a
**  timezone based on system settings.
**  Assumes that the string is a valid date.
*/
function parseISOLocal (s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2]);
}

document.write(parseISOLocal('2015-1-1'))

关于javascript - 日期 ('2015-1-1' ) 输出不同于日期 (2015-01-01),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982144/

相关文章:

javascript - 排序 alphaNumeric HTML 列表

javascript - javascript引擎识别的HTML编码字符串,这怎么可能?

node.js - 如何在发布之前安装已发布的范围包?

JSF 页面错误地反射(reflect)了日期 - 1 天偏移

javascript - Firebase 云功能 - 连接错误

javascript - 在谷歌地图中的信息窗口内单击按钮

node.js - 如何获取模型的主键属性名称? (水线 ORM)

node.js - `setTimeout` 和 `setImmediate` 之间的区别

date - RobotFramework - 获取当前日期

sql - 如何在 SQL Server 中获取今天的第一个小时?