JavaScript получает строку даты как 11 вечера накануне - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующее поле ввода: В моем веб-приложении у меня есть -

string date - 06/05/2018

И этот код JS:

var d = "06/05/2018".split("/");
var date = new Date(d[2] + "-" + d[1] + "/" + d[0]).getTime();
console.log(date)

Это возвращает 1525561200000, что, если я положу это в преобразователь эпохи , даст мне ...

Saturday, May 5, 2018 11:00:00 PM

Это приводит к сбоям в моей системе фильтрации - диапазоны дат, потому что если я выберу минимальную дату равную 06/05/2018 с полем ввода:

var d = $('#min').val()
var date = new Date(d).getTime();
console.log(date)

input field

Возвращается 1525564800000, что составляет Sunday, May 6, 2018 12:00:00 AM

Как мне обойти это?

Спасибо

1 Ответ

0 голосов
/ 07 мая 2018

Я мог бы написать целый тезис о том, насколько проблематично и сложно работать с датами в 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 ожидает, что все аргументы будут числами, когда имеется более одного аргумента, и преобразует все, что попадет в числа, внутренне)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...