Why isn't “2016-02-16” equal to “2016-02-16 00:00”?

后端 未结 5 572
慢半拍i
慢半拍i 2020-11-30 01:54

I\'m trying to pass both date strings to new Date(t).

I expect both strings represent the same time, after all, if I omit the time, shouldn\'t it be mid

5条回答
  •  广开言路
    2020-11-30 02:57

    It's what the ES5.1 specification says to do:

    The value of an absent time zone offset is “Z”.

    It also says:

    The function first attempts to parse the format of the String according to the rules called out in Date Time String Format (15.9.1.15). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats.

    Since the format requires a T separator between date and time, the valid times go to UTC:

    > new Date("2016-02-16T00:00:00")
    Tue Feb 16 2016 01:00:00 GMT+0100 (CET)
    > new Date("2016-02-16")
    Tue Feb 16 2016 01:00:00 GMT+0100 (CET)
    

    ...while in node.js, an invalid time (without the T separator) seems to go to the implementation specific localtime:

    > new Date("2016-02-16 00:00:00")
    Tue Feb 16 2016 00:00:00 GMT+0100 (CET)
    

    Note that ES6 changed this, in the same part of the documentation it changes to:

    If the time zone offset is absent, the date-time is interpreted as a local time.

    The joy of breaking changes.

    Edit

    According to TC39, the specification is meant to be interpreted as date and time strings without a time zone (e.g. "2016-02-16T00:00:00") are treated as local (per ISO 8601), but date only strings (e.g. "2016-02-16") as UTC (which is inconsistent with ISO 8601).

提交回复
热议问题