В моем проекте я использую 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.
Это является с учетом смены вашего часового пояса и я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)
UTC не имеет летнего времени и не является часовым поясом. Когда вы добавляете день с помощью локальных методов и пересекаете границу перехода на летнее время, изменяется часовой пояс и смещение UTC, поэтому вы увидите разницу в часах (и, возможно, минутах) временной метки UTC.