Добавить день через date-fns с учетом смены часового пояса

В моем проекте я использую date-fns для манипуляций с датами. Необходимо перебирать дни в некотором диапазоне. Для этого я использую следующий код:

  for (
    // from and to are always start of some day, from <= to
    let date = from;
    isBefore(date, to) || isEqual(date, to);
    date = addDays(date, 1)
  ) {
    // Some operations with date
  }

Я ожидаю, что date всегда будет началом какого-то дня, но в случае изменения часового пояса (зимнее время -> летнее время) дата будет на 1 час меньше, чем ожидалось. Вот пример:

const from = new Date('2019-03-31T00:00:00.000Z')
const fromPlusDay = dateFns.addDays(from, 1)

// I'm getting "2019-03-31T23:00:00.000Z"
// instead of "2019-04-01T00:00:00.000Z"
fromPlusDay.toISOString()

Кстати, мой часовой пояс был +2, а после перехода на летнее время стало +3.

UTC не имеет летнего времени и не является часовым поясом. Когда вы добавляете день с помощью локальных методов и пересекаете границу перехода на летнее время, изменяется часовой пояс и смещение UTC, поэтому вы увидите разницу в часах (и, возможно, минутах) временной метки UTC.

RobG 07.04.2019 23:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
3 316
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это является с учетом смены вашего часового пояса и яs в начале дня (в вашем часовом поясе, а не в формате UTC). Полночь по UTC не обязательно является началом дня в вашей зоне.

Проверьте это (я в зоне GMT+1):

const from = dateFns.parse('2019-03-31') // -> "2019-03-31T00:00:00.000+0100"
const fromPlusDay = dateFns.addDays(from, 1)

dateFns.format(fromPlusDay , 'YYYY-MM-DDTHH:mm:ss.SSSZZ') // -> "2019-04-01T00:00:00.000+0200"

Я думаю, что вы делаете все в порядке, просто не ожидайте, что ваша зона будет 00:00 в UTC, и избегайте печати дат в UTC.

Ответ принят как подходящий

Я столкнулся с той же проблемой:

6 октября 2019 года в Австралии начинается переход на летнее время.

dh.parse('2019-10-06')

возврат: сб, 05 октября 2019 г., 23:00:00 GMT+1000 (восточное стандартное время Австралии)

Решение добавляет информацию о часовом поясе (один из):

  1. Добавить знак отсутствия смещения часового пояса «Z» -- dh.parse('2019-10-06T00:00:00.000Z' )
  2. Добавить GMT -- dh.parse('2019-10-06 GMT' )
  3. Добавить +00:00 -- dh.parse('2019-10-06T00:00:00.000+00:00' )

examples]([![https://i.imgur.com/fvLWQQO.png]1)

Другие вопросы по теме