Rrule: Eventos recorrentes usando turno de um dia da semana em um dia

Criado em 22 mar. 2020  ·  3Comentários  ·  Fonte: jakubroztocil/rrule

  • [x] Verifique se você olhou os problemas existentes para duplicatas antes
    criando um novo
  • [x] Amostra de código reproduzindo o problema. Certifique-se de incluir todos os valores de entrada que você
    estão usando, como a string RRule e as datas exatas.
  • [x] Saída esperada
  • [x] Saída real
  • [x] A versão de rrule você está usando

    • 2.6.4

  • [x] Seu sistema operacional

    • Linux

  • [x] Seu fuso horário local (execute $ date partir da linha de comando da máquina que mostra o bug)

    • Europa / Paris, mas os fusos horários foram alterados. Ver abaixo


Estou tentando obter as próximas terças-feiras após uma determinada data (1 de fevereiro de 2020 na Europa / Paris).
No entanto, os eventos começam na quarta-feira se ainda estiverem nesse fuso horário.
Calculando os eventos para o fuso horário America / New_York, os eventos são os esperados.

Por favor, verifique o snippet abaixo. Minhas descobertas são:

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

Comentários muito úteis

Olá, o mesmo problema aqui
Para recorrência: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Todos 3 comentários

Olá, o mesmo problema aqui
Para recorrência: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Atualização: acho que foi puramente minha confusão em torno do comportamento padrão do rrule.js em relação às entradas UTC, bem como aos objetos JS Date.

Como deduzido de outros comentários, essa confusão parece bastante comum:
(1) Trabalhando com TZID
(2) Inserir DTSTART no formato correto (local para o fuso horário, em vez de UTC ou local para o computador)
(3) Introdução das datas corretas em rrule.between() . Se declarar um TZID, assim como você tem que massagear as datas quando elas saem - usando DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) , você tem que massagear as datas indo para between() (provavelmente after/before como bem) usando DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

Apesar dos meus problemas com a documentação e frustrações em torno do comportamento não documentado, estou muito grato por esta biblioteca existir. Obrigado ao criador e a todos os mantenedores e contribuidores. Assim como luxon surgiu das lições aprendidas com moment , acho que a próxima iteração de uma biblioteca de regras será construída sobre rrule.js .

Original postado "problema", desconsidere o que eu disse abaixo.
Também estou tendo o que parece ser esse 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))

Isso retorna uma lista de datas que ocorrem na quinta-feira.
Verifiquei se o DTSTART é UTC.

O evento em questão ocorre na sexta-feira às 18h00 às 06h00 (horário da montanha), que é o mesmo que sábado às 00h00-UTC, mas rrule.between() retorna estranhamente as horas @ quinta-feira, 18h00 às 06h00.

Terei prazer em tentar dissecar o código para ver onde / como o problema está ocorrendo. Se alguém mais familiarizado com a base de código tiver algumas dicas para me apontar na direção certa, me avise, obrigado!

@davidgoli Ei David! Estou trabalhando com o rrule há 5 dias e não consigo descobrir como trabalhar com fusos horários. Se eu inserir o horário às 21h no meu horário, ele será convertido para 4h no horário UTC. Isso causa um problema quando eu quero definir eventos recorrentes em determinados dias, digamos, sextas-feiras. Então, ele se repete na sexta-feira às 4h, e quando for traduzido de volta para o meu fuso horário, é quinta-feira, 21h, quando eu queria na sexta-feira. Você tem alguma sugestão para isso? Tentei com tzid, mas também não consigo fazer funcionar. Não tenho certeza de como devo incorporar o Luxon? Eu baixei o pacote.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

elazar picture elazar  ·  18Comentários

shavenwalrus picture shavenwalrus  ·  7Comentários

espen picture espen  ·  10Comentários

marcoancona picture marcoancona  ·  22Comentários

maconfr picture maconfr  ·  6Comentários