Rrule: Eventos recurrentes usando el turno de día de la semana por un día

Creado en 22 mar. 2020  ·  3Comentarios  ·  Fuente: jakubroztocil/rrule

  • [x] Verifique que haya examinado los problemas existentes en busca de duplicados antes
    creando uno nuevo
  • [x] Código de muestra que reproduce el problema. Asegúrese de incluir todos los valores de entrada que
    están usando como la cadena exacta RRule y las fechas.
  • [x] Resultado esperado
  • [x] Salida real
  • [x] La versión de rrule que estás usando

    • 2.6.4

  • [x] Tu sistema operativo

    • Linux

  • [x] Tu zona horaria local (ejecuta $ date desde la línea de comando de la máquina que muestra el error)

    • Europa / París, pero las zonas horarias están cambiadas. Vea abajo


Estoy tratando de obtener los próximos martes después de una fecha determinada (1 de febrero de 2020 en Europa / París).
No obstante, los eventos comienzan el miércoles si aún se encuentran en esa zona horaria.
Calculando los eventos para la zona horaria América / New_York, los eventos son los esperados.

Por favor, consulte el siguiente fragmento. Mis hallazgos son:

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

Comentario más útil

Hola, el mismo problema aquí.
Por recurrencia: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Todos 3 comentarios

Hola, el mismo problema aquí.
Por recurrencia: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Actualización: Creo que esta fue simplemente mi confusión sobre el comportamiento predeterminado de rrule.js con respecto a las entradas UTC y los objetos JS Date.

Como se desprende de otros comentarios, esta confusión parece bastante común:
(1) Trabajar con TZID
(2) Ingresando DTSTART en el formato correcto (local para la zona horaria, en lugar de UTC o local para la computadora)
(3) Ingresando las fechas correctas en rrule.between() . Si declara un TZID, al igual que tiene que masajear las fechas cuando salen, usando DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) , debe masajear las fechas que ingresan a between() (probablemente after/before como bien) usando DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

A pesar de mis problemas con la documentación y las frustraciones relacionadas con el comportamiento indocumentado, estoy muy agradecido de que exista esta biblioteca. Gracias al creador y a todos los mantenedores y colaboradores. Al igual que luxon surgió de las lecciones aprendidas de moment , creo que la próxima iteración de una biblioteca de reglas se basará en rrule.js .

"Problema" publicado originalmente, ignore lo que he dicho a continuación.
También estoy experimentando lo que parece ser este problema.

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

Esto devuelve una lista de fechas que ocurren el jueves.
Me he asegurado de que el DTSTART sea UTC.

El evento en cuestión ocurre el viernes a las 18: 00-0600 (hora de la montaña), que es lo mismo que el sábado a las 00: 00-UTC, pero rrule.between() extrañamente regresa horas @ jueves 18: 00-0600.

Con mucho gusto intentaré analizar el código para ver dónde y cómo ocurre el problema. Si alguien más familiarizado con el código base tiene algunos consejos para orientarme en la dirección correcta, hágamelo saber, ¡gracias!

@davidgoli ¡Hola, David! He estado trabajando con rrule durante los últimos 5 días y no puedo entender cómo trabajar con zonas horarias. Si pongo la hora a las 9 p. M. De mi hora, se convierte a las 4 a. M. UTC. Esto causa un problema cuando quiero configurar eventos recurrentes en ciertos días, digamos los viernes. Entonces, se repite el viernes a las 4 a. M., Y cuando se traduce de nuevo a mi zona horaria, es el jueves a las 9 p. M. Cuando lo quería el viernes. ¿Tiene alguna sugerencia para esto? Intenté con tzid pero tampoco puedo hacer que funcione. ¿No estás seguro de cómo se supone que debo incorporar Luxon? He descargado el paquete.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

anthwinter picture anthwinter  ·  11Comentarios

Prinzhorn picture Prinzhorn  ·  15Comentarios

espen picture espen  ·  10Comentarios

grigio picture grigio  ·  7Comentarios

maconfr picture maconfr  ·  6Comentarios