На сайте дейтпикер, с помощью которого, пользователи выбирают дату. Мне нужна только дата, Без времени. Выбранную дату я сохраняю в БД. В БД обычное текстовое поле. Дата сохраняется в формате "2019-01-25T12:04:00.000Z".
Теперь, чтобы вывести эту дату, я использую "let d = new Date(savedDate)".
И тут бывают баги. Например (очень редко) бывают случаи, когда в дейтпикере выбрано, например, 24 число, а через new Date() и .getDate() выводится 23. А самое удивительное, что в базе тоже лежит 23!
Я предполагаю, что дело во временных зонах. Проблема в том, что нельзя получать голую дату, без времени и всего остального, только число месяц и год. Библиотека возвращает один и тот же формат.
Как правильно работать с датой?
Использовать при сохранении время в UTC, new Date().getUTCDate() (как раз в БД и будет 23 число)
Выводить через локальный часовой пояс new Date().toLocaleDateString() (уже будет 24 при UTC+3 в час ночи)
shmatuan, Мне наоборот надо, чтоб у всех просто показывалась выбранная дата. Надо пользователю сообщить, что мероприятие будет 24 февраля и чтобы все видели именно 24 февраля.
wagoodoogoo, я думаю можно. Проблема в том, что такую дату выставляет datepicker, то есть при выборе 24 числа, он возвращает 23 и, если я обрежу, то он скорее всего покажет 23. То есть пользователь выбирает 24, библиотека возвращает после форматирования 23, а в следующий раз, когда он решит поменять дату, то увидит 23 в дейтпикере.
нет, он не преобразует дату, он её превратит в строку и обрежет, проверка:
let savedDate = "2019-01-25T23:04:00.000Z";
let d1 = new Date(savedDate).toISOString().slice(0, 10);
let d2 = new Date(savedDate);
document.write(d1);
document.write("<br />");
document.write(d2);
Если это MySQL база, то лучше сохранять время относительно временной зоны сервера, для этого не нужно со фронта передавать дату, использовать в дате тип TIMESTAMP (по умолчанию работает функция SQL NOW() ). У клиента такая дата будет парситься ( new Date(serverTimestamp * 1000) ) относительно его часового пояса.
Если всё же нужно передавать на сервер дату, то отправлять date.toUTCString() по Гринвичу или, как сказал Emil Revencu, брать new Date().getTime() / 1000 ( new Date().getTime() это в миллисекундах )