Rrule: Événements récurrents utilisant le décalage de jour de semaine d'un jour

Créé le 22 mars 2020  ·  3Commentaires  ·  Source: jakubroztocil/rrule

  • [x] Vérifiez que vous avez déjà examiné les problèmes existants pour les doublons
    en créer un nouveau
  • [x] Exemple de code reproduisant le problème. Assurez-vous d'inclure toutes les valeurs d'entrée que vous
    utilisent comme la chaîne RRule exacte et les dates.
  • [x] Sortie attendue
  • [x] Sortie réelle
  • [x] La version de rrule vous utilisez

    • 2.6.4

  • [x] Votre système d'exploitation

    • Linux

  • [x] Votre fuseau horaire local (exécutez $ date partir de la ligne de commande de la machine affichant le bogue)

    • Europe/Paris mais les fuseaux horaires sont décalés. Voir ci-dessous


J'essaye d'avoir les prochains mardis après une date donnée (1er février 2020 en Europe/Paris).
Néanmoins, les événements commencent mercredi s'ils sont toujours dans ce fuseau horaire.
En calculant les événements pour le fuseau horaire America/New_York, les événements sont comme prévu.

Veuillez vérifier l'extrait ci-dessous. Mes découvertes sont :

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

Commentaire le plus utile

Bonjour, même problème ici
Pour la récurrence : "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Tous les 3 commentaires

Bonjour, même problème ici
Pour la récurrence : "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Mise à jour : je pense que c'était purement ma confusion autour du comportement par défaut de rrule.js concernant les entrées UTC ainsi que les objets JS Date.

Comme il ressort d'autres commentaires, cette confusion semble assez courante :
(1) Travailler avec TZID
(2) Saisie de DTSTART dans le format correct (local au fuseau horaire, plutôt qu'UTC ou local à l'ordinateur)
(3) Saisir les bonnes dates dans rrule.between() . Si vous déclarez un TZID, un peu comme vous devez masser les dates lorsqu'elles sortent - en utilisant DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) , vous devez masser les dates entrant dans between() (probablement after/before comme bien) en utilisant DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

Malgré mes problèmes avec la documentation et les frustrations liées aux comportements non documentés, je suis très reconnaissant que cette bibliothèque existe. Merci au créateur et à tous les mainteneurs et contributeurs. Tout comme luxon est né des leçons apprises de moment , je pense que la prochaine itération d'une bibliothèque de règles s'appuiera sur les épaules de rrule.js .

"problème" publié à l'origine, ne tenez pas compte de ce que j'ai dit ci-dessous.
Connaissant également ce qui semble être ce problème.

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

Cela renvoie une liste de dates qui se produisent le jeudi.
Je me suis assuré que le DTSTART est UTC.

L'événement en question se produit le vendredi à 18:00-0600 (heure des Rocheuses), ce qui est le même que samedi 00:00-UTC, mais rrule.between() renvoie curieusement les heures @ jeudi 18:00-0600.

J'essaierai volontiers de disséquer le code pour voir où/comment le problème se produit. Si quelqu'un de plus familier avec la base de code a quelques conseils pour m'orienter, faites-le moi savoir, merci !

@davidgoli Salut David ! Je travaille avec rrule depuis 5 jours et je ne sais pas comment travailler avec les fuseaux horaires. Si je mets l'heure à 21 heures, elle est convertie en 4 heures UTC. Cela pose un problème lorsque je souhaite définir des événements récurrents certains jours, disons le vendredi. Donc, il se répète vendredi à 4 heures du matin, et quand il est traduit dans mon fuseau horaire, il est alors jeudi 21 heures, alors que je le voulais vendredi. Avez-vous des suggestions pour cela? J'ai essayé avec tzid mais je n'arrive pas à le faire fonctionner non plus. Vous ne savez pas comment je suis censé intégrer Luxon ? J'ai téléchargé le package.

Cette page vous a été utile?
0 / 5 - 0 notes