У меня есть набор правил (реализован в rrule.js ), который дает мне массив времени начала события (см. Демоверсию 1004 *).rrule.js
на самом деле не обеспечивает концепцию продолжительности события или endtime
... Таким образом, он может сообщить мне точную дату, когда начнется миллионное повторение повторяющегося события, но не когда это произойдет.конец.Оказывается, я действительно хочу знать, когда мероприятие заканчивается, поэтому мне придется проявить творческий подход.Насколько я вижу, у меня есть два варианта
DB SIDE: сохранить строку правила + событие duration
.
CLIENT SIDE: восстановить начало событиймассив дат из строки правила.Будет известен только start times
, а end times
будет рассчитываться путем добавления продолжительности как смещения к каждому времени начала в массиве.
СТОРОНА БД: Хранить измененную строку правила, которая кодирует endtime
.
СТОРОНА КЛИЕНТА: Специальная функция-оболочка считывает измененную строку правила и восстанавливает ее как двемассивы дат;один представляет время начала события, а другой - время окончания.
Вариант 1 кажется более простым, но я подозреваю, что у него возникнут проблемы с переходом на летнее время.Например, скажем, у меня мероприятие, которое проводится каждый вторник с 18:00 до 02:00 по средам.В этом случае я бы сохранял в своей базе данных продолжительность 8 часов вместе с этим строгим правилом.Теперь давайте перенесемся в любой 6 вечера вторника в будущем.Всегда ли мое мероприятие заканчивается в среду в 2 часа ночи (или из-за этой продолжительности 8 часов мое мероприятие заканчивается в 1 или 3 часа ночи)? Как сделать так, чтобы оно всегда заканчивалось в 2 часа ночи?
... Если вы знаете ответ, просто перестаньте читать здесь.
Как я видел, как другие справляютсясмещение длительности
Согласно Кипу в Как добавить 30 минут к объекту JavaScript Date? smart способ смещения даты и времени состоит в использовании такой необычной библиотеки, какmoment.js.
Он подчеркивает этот момент, показывая, как легко все идет не так, используя необычные библиотеки времени и даты (показывая, как функция смещения наивной минуты не работает из-за перехода на летнее время)
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
addMinutes(new Date('2014-11-02'), 60*24) //In USA, prints 11pm on Nov 2, not 12am Nov 3!
Но что-то странное происходит со мной.Предполагалось, что вышеприведенная функция выдает 11pm on Nov 2
- это неправильный ответ, т. Е. Она должна была потерпеть неудачу из-за перехода на летнее время.Когда я запускаю его, он на самом деле выводит правильное время 12am on Nov 3
(примечание: я нахожусь в Чикаго / Центральное время).
Когда я сравниваю вывод его наивной функции с выводом moment.js иluxon.js, я получаю тот же ответ, который вы видите в этом наблюдаемом блокноте .
Почесываете голову
Более того, если вы используете Luxon или момент, когда выдобавьте количество дней в минутах к 2014-11-02
, вы получите 2014-11-03T00:00:00.000Z
, но если вы просто добавите день к 2014-11-02
, вы получите 2014-11-03T01:00:00.000Z
- это час отдыха.
Так что мне лучше продолжитьвариант 2?