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

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).

Leave a Comment