Rrule: Wiederkehrende Ereignisse mit byweekday Verschiebung um einen Tag

Erstellt am 22. März 2020  ·  3Kommentare  ·  Quelle: jakubroztocil/rrule

  • [x] Überprüfen Sie, ob Sie bereits vorhandene Probleme nach Duplikaten durchgesehen haben
    einen neuen erstellen
  • [x] Codebeispiel, das das Problem reproduziert. Achten Sie darauf, alle Eingabewerte anzugeben, die Sie
    verwenden, wie zum Beispiel die genaue RRule-Zeichenfolge und Daten.
  • [x] Erwartete Ausgabe
  • [x] Tatsächliche Leistung
  • [x] Die Version von rrule Sie verwenden

    • 2.6.4

  • [x] Ihr Betriebssystem

    • Linux

  • [x] Ihre lokale Zeitzone (führen Sie $ date über die Befehlszeile des Computers aus, der den Fehler anzeigt)

    • Europa/Paris, aber die Zeitzonen sind verschoben. Siehe unten


Ich versuche, die nächsten Dienstage nach einem bestimmten Datum (1.02.2020 in Europa/Paris) zu bekommen.
Nichtsdestotrotz beginnen die Ereignisse am Mittwoch, wenn Sie sich noch in dieser Zeitzone befinden.
Bei der Berechnung der Ereignisse für die Zeitzone America/New_York sind die Ereignisse wie erwartet.

Bitte überprüfen Sie den folgenden Ausschnitt. Meine Erkenntnisse sind:

// 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())

Hilfreichster Kommentar

Hallo, das gleiche Problem hier
Bei Wiederholung: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

rule.all() zeigt TU,WE,TH,FR,SA

Alle 3 Kommentare

Hallo, das gleiche Problem hier
Bei Wiederholung: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

rule.all() zeigt TU,WE,TH,FR,SA

Update: Ich denke, dies war nur meine Verwirrung über das Standardverhalten von rrule.js in Bezug auf UTC-Eingaben sowie JS-Datumsobjekte.

Wie aus anderen Kommentaren hervorgeht, scheint diese Verwirrung recht verbreitet zu sein:
(1) Arbeiten mit TZID
(2) Eingabe von DTSTART im richtigen Format (lokal auf die Zeitzone, statt UTC oder lokal auf dem Computer)
(3) Eingabe der richtigen Daten in rrule.between() . Wenn Sie eine TZID deklarieren, müssen Sie die Daten, die herauskommen, massieren - mit DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) , Sie müssen die eingehenden Daten in between() (wahrscheinlich after/before als gut) mit DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

Trotz meiner Probleme mit der Dokumentation und meiner Frustration über undokumentiertes Verhalten bin ich sehr dankbar, dass es diese Bibliothek gibt. Vielen Dank an den Ersteller und alle Betreuer und Mitwirkenden. Ähnlich wie luxon aus den Lektionen aus moment , denke ich, dass die nächste Iteration einer Regelbibliothek auf den Schultern von rrule.js aufbauen wird.

Original gepostet "Problem", ignorieren Sie, was ich unten gesagt habe.
Auch erfährt, was dieses Problem zu sein scheint.

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))

Dies gibt eine Liste der Daten zurück, die am Donnerstag auftreten.
Ich habe sichergestellt, dass der DTSTART UTC ist.

Das fragliche Ereignis findet am Freitag um 18:00-0600 (Bergzeit) statt, was mit Samstag 00:00-UTC identisch ist, aber rrule.between() seltsamerweise die Zeiten @ Donnerstag 18:00-0600 zurück.

Ich werde gerne versuchen, den Code zu analysieren, um zu sehen, wo/wie das Problem auftritt. Wenn jemand, der besser mit der Codebasis vertraut ist, Tipps hat, die mich in die richtige Richtung weisen, lassen Sie es mich wissen, danke!

@davidgoli Hey David! Ich arbeite seit 5 Tagen mit rrule und kann nicht herausfinden, wie man mit Zeitzonen arbeitet. Wenn ich die Zeit um 21:00 Uhr meiner Zeit eingebe, wird sie in 4:00 Uhr UTC-Zeit umgewandelt. Dies führt zu einem Problem, wenn ich an bestimmten Tagen wiederkehrende Ereignisse festlegen möchte, sagen wir freitags. Dann wird es Freitag 4 Uhr morgens wiederholt, und wenn es zurück in meine Zeitzone übersetzt wird, dann ist es Donnerstag 21 Uhr, als ich es am Freitag wollte. Haben Sie hierzu Vorschläge? Ich habe es mit tzid versucht, aber ich bekomme das auch nicht zum Laufen. Nicht sicher, wie ich Luxon integrieren soll? Ich habe das Paket heruntergeladen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

anthwinter picture anthwinter  ·  11Kommentare

espen picture espen  ·  11Kommentare

kirrg001 picture kirrg001  ·  5Kommentare

marcoancona picture marcoancona  ·  22Kommentare

grigio picture grigio  ·  7Kommentare