【问题标题】:Why a given date turns into a day before when using new Date()? [duplicate]为什么使用 new Date() 时给定的日期会变成前一天? [复制]
【发布时间】:2016-05-14 08:05:06
【问题描述】:

给定的日期是2016-02-04。那应该是 2016 年 2 月 4 日。但是当我使用 new Date() 时,它返回为 Wed Feb 03 2016 16:00:00 GMT-0800 (PST) 而不是 Thu Feb 04...。

以下是我真正所做的一切:

var _entryDate = new Date("2016-02-04");
console.log(_entryDate); // Wed Feb 03 2016 16:00:00 GMT-0800 (PST)

为什么会发生这种情况?如何获得我想要的结果,即 2 月 4 日而不是前一天?

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    您使用的格式被解释为 UTC 日期,因此时间假定为 西欧的午夜。比你早 8 小时。

    您可以通过将T00:00-0800 附加到日期字符串来强制解释时区。您自己解析日期并使用数字年、月和日期参数构造 Date 实例可能会更健壮。

    【讨论】:

    • 如果我们错过传递给构造函数的字符串中的tz部分,日期构造函数是否会退回到UTC?我认为它会退回到本地 'tz' :)
    • @sabithpocker 对于 ISO 日期/时间字符串,默认为 Z (UTC)。如果创建带有数字年月日的日期,则默认为本地时区。
    【解决方案2】:

    这是因为日期以 UTC 存储(和解析),但显示在您当地的时区。要显示正确的日期,您可以使用

    new Date("2016-02-04").toISOString()
    

    【讨论】:

    • 不,不要那样做。手动解析字符串。
    • 它仍然只会返回 1 天的回溯日期
    【解决方案3】:

    var dateArray = "2016-02-04".split("-");
    var year = dateArray[0];
    var month = parseInt(dateArray[1], 10) - 1;
    var date = dateArray[2];
    var _entryDate = new Date(year, month, date);
    alert(_entryDate);

    按照@RobG 的建议,为month 和year 删除了不必要的parseInt

    而且我不知道 Pointy 指向什么(如无知)。我从不 知道日期构造函数将根据格式回退到 UTC 字符串通过。 这样 Date 构造函数将始终使用本地时区构建 Date 。 无论如何,使用带数字参数的 Date 构造函数总是好的。

    【讨论】:

    • 手动解析字符串是个好主意,但这里不需要 parseInt。传递给 Date 构造函数 are first converted to Number 的参数。
    • @RobG 感谢您的建议。我从来不知道。
    【解决方案4】:

    Javascript Date 对象也包含时间。如果你创建一个没有时间组件的,它默认为午夜。

    问题是,午夜在哪个时区?如果您从字符串中解析日期,则 ECMAScript 定义中未指定;这取决于实施。但大多数实现都选择世界时间 - 这意味着表示的时刻落在伦敦以西和国际日期变更线以东的任何地方的前天。

    如果您从数字创建日期而不是解析字符串,则将其指定为本地时间,而不是 Javascript 认为的任何时区。例如,在美国/东部(“EST”):

    new Date('2016-02-04')
    //=> Wed Feb 03 2016 19:00:00 GMT-0500 (EST)  - midnight UTC
    new Date(2016,2,4)
    //=> Fri Mar 04 2016 00:00:00 GMT-0500 (EST)  - midnight EST
    

    您可以在字符串末尾添加明确的时间和时区:

    new Date('2016-02-04T00:00:00-05:00')
    

    但您必须知道时区偏移量才能做到这一点。或者您可以手动解析字符串并使用数字构造函数,这可能是您最安全的选择。

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2016-08-22
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 2014-11-26
      • 1970-01-01
      • 2019-07-12
      相关资源
      最近更新 更多