Конструктор дат

Что не так?

String(new Date(2015, 0)) === String(new Date('2015-01')) // false

Первое января, которое создаётся конструктором new Date из нескольких аргументов не равно первому января, созданному конструктором new Date из строки в ISO-формате.

Почему так?

А что же создаётся в том и другом случае?

 

String(new Date(2015, 0))   // "Thu Jan 01 2015 00:00:00 GMT+0300"
String(new Date('2015-01')) // "Thu Jan 01 2015 03:00:00 GMT+0300"

Ух ты. Смещение часового пояса. Друг мой, а почему ж ты в одном случае учитываешься, а во втором — нет?

Обратимся к документации, там наверняка есть логичное объяснение.

Обратите внимание: если функция Date вызывается в качестве конструктора с более чем одним аргументом, то указанные аргументы интерпретируются как локальное время. Если аргументы указывают время в UTC, используйте new Date(Date.UTC(...)) с теми же аргументами.

© MDN

Иными словами

ПРОСТ))00))

Что же делать?

Читать документацию, работать с датами только одним из этих способов, либо черёз обёртки.