rrule
você está usando$ date
partir da linha de comando da máquina que mostra o bug)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())
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.
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()
mostraTU,WE,TH,FR,SA