Rrule: Повторяющиеся события с использованием посуточной смены на один день

Созданный на 22 мар. 2020  ·  3Комментарии  ·  Источник: jakubroztocil/rrule

  • [x] Убедитесь, что вы просмотрели существующие проблемы на наличие дубликатов ранее
    создание нового
  • [x] Пример кода, воспроизводящий проблему. Обязательно укажите все входные значения, которые вы
    используются, например, точная строка RRule и даты.
  • [x] Ожидаемый результат
  • [x] Фактический выход
  • [x] Версия rrule вы используете

    • 2.6.4

  • [x] Ваша операционная система

    • Linux

  • [x] Ваш местный часовой пояс (запустите $ date из командной строки машины, на которой обнаружена ошибка)

    • Европа / Париж, но часовые пояса сдвинуты. Увидеть ниже


Я пытаюсь получить следующие вторники после указанной даты (1 февраля 2020 года в Европе / Париже).
Тем не менее, события начинаются в среду, если все еще находятся в этом часовом поясе.
При вычислении событий для часового пояса Америка / Нью-Йорк события соответствуют ожидаемым.

Пожалуйста, проверьте приведенный ниже фрагмент. Мои выводы:

// problem: events should be on Tuesday but are shifted by one day:
// Tue Feb 04 2020 00:00:00 GMT+0100 (Central European Standard Time) ...
$ TZ=Europe/Paris node zone.js Europe/Paris
rule:
DTSTART;TZID=Europe/Paris:20200131T230000
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Wed Feb 05 2020 00:00:00 GMT+0100 (Central European Standard Time)
Wed Feb 12 2020 00:00:00 GMT+0100 (Central European Standard Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT+0100 (Central European Standard Time)

// timezone America/New_York shows correct result
$ TZ=America/New_York node zone.js America/New_York
rule:
DTSTART;TZID=America/New_York:20200201T050000
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Tue Feb 04 2020 00:00:00 GMT-0500 (Eastern Standard Time)
Tue Feb 11 2020 00:00:00 GMT-0500 (Eastern Standard Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT-0500 (Eastern Standard Time)

// crossing timezones show correct result
$ TZ=America/New_York node zone.js Europe/Paris
rule:
DTSTART;TZID=Europe/Paris:20200201T050000
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Mon Feb 03 2020 18:00:00 GMT-0500 (Eastern Standard Time)
Mon Feb 10 2020 18:00:00 GMT-0500 (Eastern Standard Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT-0500 (Eastern Standard Time)

// UTC shows correct result
$ TZ=UTC node zone.js UTC
rule:
DTSTART:20200201T000000Z
RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=2
events:
Tue Feb 04 2020 00:00:00 GMT+0000 (Coordinated Universal Time)
Tue Feb 11 2020 00:00:00 GMT+0000 (Coordinated Universal Time)
luxon:
Sat Feb 01 2020 00:00:00 GMT+0000 (Coordinated Universal Time)
const { DateTime } = require('luxon')
const { RRule } = require('rrule/dist/es5/rrule-tz.js')

const dtstart = new Date(2020, 1, 1, 0)
const tzid = process.argv[2] || 'Europe/Paris'

const rule = new RRule({
  freq: RRule.WEEKLY,
  dtstart,
  tzid,
  byweekday: [RRule.TU],
  count: 2
})

console.log('rule:\n' + rule.toString())
console.log('events:\n' + rule.all().map(d => d.toString()).join('\n'))

const datetime = DateTime.fromJSDate(dtstart).setZone(tzid)
console.log('luxon:\n' + datetime.toJSDate().toString())

Самый полезный комментарий

Привет, такая же проблема здесь
Для повторения: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

rule.all() показывает TU,WE,TH,FR,SA

Все 3 Комментарий

Привет, такая же проблема здесь
Для повторения: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

rule.all() показывает TU,WE,TH,FR,SA

Обновление: я думаю, что это было чисто мое замешательство по поводу поведения rrule.js по умолчанию в отношении входных данных UTC, а также объектов JS Date.

Судя по другим комментариям, эта путаница кажется довольно распространенной:
(1) Работа с TZID
(2) Ввод DTSTART в правильном формате (локально для часового пояса, а не в формате UTC или локально для компьютера)
(3) Ввод правильных дат в rrule.between() . При объявлении TZID аналогично тому, как вы должны массировать даты, когда они выходят - используя DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) , вы должны массировать даты, входящие в between() (вероятно, after/before как хорошо) с помощью DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

Несмотря на мои проблемы с документацией и разочарование по поводу недокументированного поведения, я очень благодарен, что эта библиотека существует. Спасибо создателю и всем сопровождающим и участникам. Подобно тому, как luxon выросло из уроков, извлеченных из moment , я думаю, что следующая итерация библиотеки rrule будет опираться на плечи rrule.js .

Оригинал опубликовал "проблему", не обращайте внимания на то, что я сказал ниже.
Также испытываю то, что, похоже, является этой проблемой.

import { rrulestr } from 'rrule';

const twoWeeks = 1209600000;
const myrrule = ["DTSTART:20200104T000000Z", "RRULE:FREQ=WEEKLY;BYDAY=FR"]
rrulestr(myrrule.join('\n'))
    .between(new Date(Date.now() - twoWeeks), new Date(Date.now() + twoWeeks))

Это возвращает список дат, приходящихся на четверг.
Я убедился, что DTSTART - это UTC.

Рассматриваемое событие происходит в пятницу в 18: 00-0600 (время в горах), что совпадает с субботой 00: 00-UTC, но rrule.between() странным образом возвращает время в четверг 18: 00-0600.

Я с удовольствием попытаюсь проанализировать код, чтобы увидеть, где и как возникает проблема. Если у кого-то, более знакомого с кодовой базой, есть несколько советов, которые укажут мне правильное направление, дайте мне знать, спасибо!

@davidgoli Привет, Дэвид! Я работал с rrule последние 5 дней и не могу понять, как работать с часовыми поясами. Если я введу время в 21:00 по моему времени, оно будет преобразовано в 4:00 по всемирному координированному времени. Это вызывает проблему, когда я хочу установить повторяющиеся события в определенные дни, скажем, по пятницам. Затем он повторяется в пятницу в 4 утра, и когда он переводится обратно в мой часовой пояс, тогда уже четверг 9 вечера, когда я хотел его в пятницу. Есть ли у вас какие-нибудь предложения по этому поводу? Я пробовал с tzid, но у меня тоже не получается. Не знаете, как мне подключить Luxon? Я скачал пакет.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

fatshotty picture fatshotty  ·  5Комментарии

zeluspudding picture zeluspudding  ·  11Комментарии

berardo picture berardo  ·  9Комментарии

grigio picture grigio  ·  7Комментарии

marcoancona picture marcoancona  ·  22Комментарии