Я мог бы написать целый тезис о том, насколько проблематично и сложно работать с датами в Javascript и как избежать ошибок и странных ошибок, но в конце ваша конкретная проблема сводится к простой опечатке.
Строка, которую вы анализируете вручную и передаете в конструктор Date
, выглядит следующим образом:
2018-05/06
Вы ошибочно использовали /
вместо -
в качестве второго разделителя при конкатенации строки. По какой-то причине браузер затем создает объект даты как полночь 2018-05-06 местное время . При передаче строки в стандартном формате (что происходит при извлечении ее из ввода даты), то есть 2018-05-06
, объект даты создается как полночь 2018-05-06 UTC время .
Итак, короче говоря, вашу проблему можно решить, заменив "/"
на "-"
в конкатенации строк, и две даты должны совпадать.
Однако, я должен отметить, что передача строки конструктору Date
ненадежна, поскольку результат не стандартизирован и может отличаться в разных браузерах (именно поэтому он ведет себя так непредсказуемо и, по-видимому, нелогично в этом случае). Лучше вместо этого передавать числа, поскольку спецификация определяет результат этого. Вы уже на полпути, так как разбили строку даты на ее компоненты. Попробуйте это:
var date = new Date(
Number(d[2]),
Number(d[1]) - 1, // Subtracting 1 from month since it's base 0
Number(d[0])
).getTime();
(Технически, нам даже не нужно явно преобразовывать в Number
, так как конструктор Date
ожидает, что все аргументы будут числами, когда имеется более одного аргумента, и преобразует все, что попадет в числа, внутренне)