Как вы анализируете дату из ввода даты HTML5?

У меня есть вход на моей веб-странице, что я могу установить дату, получив строку ISO и вытащив первые 10 символов.

date = new Date();
dateInput.value = date.toISOString().substr(0,10);

Это прекрасно работает. Моя проблема в том, что когда я пытаюсь вернуть дату. Я получаю дату в один выходной день.

var newDate = new Date(dateInput.value);

Я также пробовал использовать следующий код, но это не всегда правильно.

новая дата (Date.parse(element.value) + 86400000)

Итак, мой вопрос: есть ли элегантный способ получить правильную дату последовательно. Я немного оглядывался, но кажется, что в Javascript не так много согласованности с парсингами даты.

Ответ 1

Он интерпретирует дату как UTC, которая для большинства часовых поясов будет казаться "вчера". Одним из решений может быть добавление смещения временной зоны обратно в дату, чтобы "преобразовать" его в локальный часовой пояс.

Ответ 2

Если это фактический ввод date в поддерживающем браузере, то он будет иметь свойство valueAsDate. Нет необходимости разбирать его.

Ответ 3

var newDate = new Date(dateInput.value + 'T00:00');

Это даст правильную дату в любой временной зоне.

Ответ 4

как говорит Марти, проблема заключается в различии между представлением часового пояса ввода (UTC, определяемым W3C) и часовым поясом JS (локальным). Решение заключается в getTimezoneOffset (который находится в минутах) и конвертирует все в миллисекунды:

var today = document.getElementById("myInputDate").valueAsDate;
var tomorrow = new Date(today.valueOf() + 86400000 + (today.getTimezoneOffset() * 60000));

86400000 = миллисекунды дня

today.getTimezoneOffset() * 60000 = timezoneOffset в миллисекундах

Ответ 5

Вы также можете преобразовать входную строку из YYYY-MM-DD в MM/DD/YYYY, а затем проанализировать дату, чтобы получить правильный ответ.

ПРИМЕР:

new Date(Date.parse('2018-09-28'))= Thu Sep 27 2018 19:00:00 GMT-0500 (центральное летнее время)

new Date(Date.parse('09/28/2018'))= Пт 28 сентября 2018 00:00:00 GMT-0500 (центральное летнее время)

(ПРИМЕЧАНИЕ: я нахожусь в CDT)

Ответ 6

Функция getDate() в Javascript Date основана на нулевом значении, а не на одном. Вот пример:

http://jsfiddle.net/R8Wub/3/

var enteredDate = document.getElementById('dateInput').valueAsDate;
var result = "Day: " + enteredDate.getDate() + "<br/>" +
    "Month: " + enteredDate.getMonth() + "<br/>" +
    "Year: " + enteredDate.getFullYear();
document.getElementById('output').innerHTML = "Result is:<br/>" + result;

Выберите дату и нажмите кнопку. Обратите внимание, что значение getDate() будет меньше, чем день месяца в календаре, потому что он основан на нуле.