Проблема с объектом Date в JavaScript

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