代码之家  ›  专栏  ›  技术社区  ›  Daniel H

Javascript日期对象为不同格式的日期字符串提供不同的时区

  •  0
  • Daniel H  · 技术社区  · 7 年前

    有人知道为什么Javascript Date对象会根据字符串的格式改变时区吗?是否有办法避免这种情况?

    例如,在西海岸(Firefox出于某种原因使用PST,Chrome使用PDT),

    new Date("08/30/2018") -> Date 2018-08-30T08:00:00.000Z
    

    new Date("2018-08-30") -> Date 2018-08-30T00:00:00.000Z
    

    我花了一段时间来调试这个问题,如果可能的话,我宁愿不必添加额外的代码来更改时区或重新格式化输入字符串。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jason    7 年前

    我没有说明书上的答案,但我能猜出来。@charlietfl在正确的轨道上- 08/30/2018 是一种美国(或其他“本地”)特有的格式-它没有得到国际认可,尤其是大多数欧洲国家颠倒了日期和月份的顺序。因此,如果您将时间放在本地格式中,它会假定您不知道任何更好的时间,只需将时区设置为浏览器中的任何系统时区。

    如果使用规范化字符串

    如果时区很重要,我建议您在初始化对象时指定它(即使您 希望 你的 当地时间。国际公认的日期格式是UTC,我们两个。

    我不满足于猜测。 According to the docs , Date() Date.parse() 方法来解析字符串并识别需要的日期-表面上它遵循规范 here here -在这里,这些似乎只起到了很小的作用,没有花费超出我意愿的时间。

    Documentation for Date.parse() 指示它接受输入值并返回自Epoch以来的毫秒数。

    以下是与您相关的信息,来自 日期.parse() :

    给定日期字符串“2014年3月7日”,parse()假定为本地时区,但给定ISO格式(如“2014-03-07”)时,它将假定为UTC时区

        2
  •  1
  •   mc.    7 年前

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

    日期.parse,它们是等价的)由于 浏览器差异和不一致。支持RFC 2822格式 字符串仅按惯例。对ISO 8601格式的支持在以下方面有所不同 仅该日期字符串(例如“1970-01-01”)被视为UTC,而不是 本地的。

    https://momentjs.com/ 甚至 https://moment.github.io/luxon/ 用于使用 datestring + format

    moment("12-25-1995", "MM-DD-YYYY");