Мне нужно сравнить дату, полученную с сервера, с датой, выбранной пользователем, и показать результат проверки. Но я столкнулся со странным поведением при преобразовании серверной даты в объект Date в JavaScript.
Когда я меняю формат даты с yyyy-mm-dd на mm-dd-yyyy, результат почему-то отличается. Вот пример:
const date1 = new Date('2023-05-15');
console.log(date1); // 2023-05-15T00:00:00.000Z
const date2 = new Date('05-15-2023');
console.log(date2); // 2023-05-14T21:00:00.000Z
Почему происходит такое различие? Как правильно работать с датами в таком случае? Буду благодарен за объяснение и совет, как лучше решить эту задачу.
Разница в результатах связана с часовыми поясами. Date() считает ‘2023-05-15’ как UTC, а ‘05-15-2023’ как локальное время. Для надежной работы лучше использовать ISO формат (YYYY-MM-DD) или библиотеку вроде Moment.js. Также можно создавать Date с помощью конструктора, передавая год, месяц и день отдельно. Как именно ты получаешь дату с сервера? Может, стоит её сразу преобразовывать в нужный формат?
Понимаю твою проблему, сам с таким сталкивался. Вот что помогло мне: используй UTC методы при работе с датами. Например:
const serverDate = new Date('2023-05-15');
const userDate = new Date('05-15-2023');
if (serverDate.getUTCFullYear() === userDate.getUTCFullYear() &&
serverDate.getUTCMonth() === userDate.getUTCMonth() &&
serverDate.getUTCDate() === userDate.getUTCDate()) {
console.log('Даты совпадают');
}
Так ты избежишь проблем с часовыми поясами. А для форматирования дат советую Intl.DateTimeFormat - он крутой и нативный.
да, с датами в джаваскрипте бывает такая головная боль. я тоже раньше с этим мучился. мой совет - попробуй использовать метод Date.parse() для преобразования строки в миллисекунды, а потом создавай объект Date из этого числа. типа так:
const date = new Date(Date.parse('2023-05-15'));
это должно работать одинаково для обоих форматов. еще можно посмотреть в сторону библиотеки dayjs, она легковесная и удобная для работы с датами. главное не забывай про часовые пояса, они часто подводят