Я хотел бы иметь возможность создать период времени, который всегда открыт для пользователя веб-приложения в указанное время, например, всегда 8: 00-9: 00, независимо от часового пояса и изменения времени (переход на летнее время время).
Существует ли возможность интерпретировать время UT C без дополнительных запросов таким образом, чтобы отображалось всегда одинаковое время?
Пример: isDTS == false -> 08: 00 + 1 создать расписание (закончится 7:00 + 0 UT C)
несколько недель спустя: isDTS == true -> получить UT C (07: 00 + 0) -> 09: 00 + 2
Есть разница!
Существует ли шаблон, позволяющий избежать этого эффекта, например, без проверки (moment().isDST()
см. момент. js) и без сохранения дополнительной информации.
Подходы:
- сохранение времени UT C всегда без DST.
var tz = 'Europe/Paris'; // or whatever your time zone is
var dt = '2020-04-14 08:00:00'; // or whatever date/time you're working with
moment.tz(dt,tz).isDST() // returns true in this case
(есть также страны, в которых сдвиг DST не равен 1 ч ... )
В соответствии с передовой практикой будущие даты следует хранить по местному времени. Это потому, что, как указано в комментариях, правила часовых поясов могут и действительно изменятся. Таким образом, вы не можете правильно рассчитать правильную дату UTC для местного времени раньше времени.
Когда вы сохраняете будущую дату, вы должны хранить ее с часовым поясом IANA, который пользователь ожидает от времени события до быть внутри. Тогда вы бы на самом деле сделали обратное преобразование, которое вы делаете сейчас. Вы должны преобразовать местное время в UT C, если вам необходимо знать точную точку события на глобальной временной шкале.
Имейте в виду, что база данных часовых поясов IANA часто обновляется. Это прямо сейчас на версии 2016d, что означает, что она уже обновлялась четыре раза в этом году. Если у вас есть приложение, которое будет использоваться в нескольких странах, вам необходимо быть очень внимательным в отношении постоянного обновления часового пояса, чтобы не отставать от изменений.
Что касается того, почему вы видите свое UT * Даты 1058 * изменяются неправильно сейчас. Я думаю, что вы берете запланированную дату, переводите ее в UT C, а затем вычисляете время повторения. Когда вы делаете математику в UT C, она не будет правильно учитывать сдвиги летнего времени, потому что не знает о них. Таким образом, когда момент преобразует эту дату обратно в локальную, она будет отключена на час. Если бы вы делали дату по математике по местному времени, а затем конвертировали в UT C для сохранения, ваше преобразование обратно было бы правильным, ПРЕДОСТАВЛЕНО, что правила часового пояса не изменились. Но не делайте этого - сохраняйте даты по местному времени.