lssssssssssl
@lssssssssssl

Алгоритм для работы с датой?

В общем, есть дата в милисекундах, приходит ещё одна дата.
Целью является получение трёх вариантов:
1. Даты в точности до суток совпадают.
2. Одна дата является следующим днём другой.
3. Всё остальные случаи.

Завостка со вторым пунктом, например, как определить, что 1 января это следующий день после 31 декабря? И всё в этом роде.
  • Вопрос задан
  • 92 просмотра
Решения вопроса 2
@Spaceoddity
https://developer.mozilla.org/ru/docs/Web/JavaScri...
https://developer.mozilla.org/ru/docs/Web/JavaScri...
Ну и т.д.
Т.е. переводите миллисекунды в дни, месяцы и годы и начинаете сравнивать - дни, месяцы и годы. Сравнение месяцев и годов нужно как раз для обработки таких "экстремальных" случаев (последний день года или месяца). Если разность дней больше 1 - сравниваете месяцы, если так же разница в 1 - сравниваете годы. Это общий случай работы с подобными алгоритмами.
Но есть варианты "оптимизации" - я бы просто делил нацело обе ваши даты на 86 400 000 (число миллисекунд в сутках) - получите порядковый номер суток, начиная с 1 января 1970. Ну а дальше уж просто.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Объекту Date можно устанавливать новую дату не только в рамках 1..31. Год, месяц скорректируются, если добавить, скажем, сразу 100500 дней. Этот / следующий день считаем в часовом поясе браузера:
const isSameDay = (d1, d2) => d1.getFullYear() === d2.getFullYear()
  && d1.getMonth() === d2.getMonth()
  && d1.getDate() === d2.getDate();

const compareDates = (ms1, ms2) => {
  const d1 = new Date(ms1);
  const d2 = new Date(ms2);

  if (isSameDay(d1, d2)) return "SAME_DAY";
  d1.setDate(d1.getDate() + 1); // тут и месяц и год добавятся, если надо
  if (isSameDay(d1, d2)) return "NEXT_DAY";
  return "OTHER";
}


Проверки

compareDates(1635688540289, 1635688540289) // "SAME_DAY"
compareDates(1635688540289, 1635768540289) // "NEXT_DAY"
compareDates(1635688540289, 0) // "OTHER"

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы