Rrule: Acara Berulang menggunakan shift byweekday satu hari

Dibuat pada 22 Mar 2020  ·  3Komentar  ·  Sumber: jakubroztocil/rrule

  • [x] Pastikan Anda telah memeriksa masalah yang ada untuk duplikat sebelumnya
    membuat yang baru
  • [x] Contoh kode yang mereproduksi masalah. Pastikan untuk memasukkan semua nilai input Anda
    menggunakan seperti string dan tanggal RRule yang tepat.
  • [x] Keluaran yang diharapkan
  • [x] Keluaran aktual
  • [x] Versi rrule Anda gunakan

    • 2.6.4

  • [x] Sistem operasi Anda

    • Linux

  • [x] Zona waktu lokal Anda (jalankan $ date dari baris perintah mesin yang menunjukkan bug)

    • Eropa/Paris tetapi zona waktu digeser. Lihat di bawah


Saya mencoba untuk mendapatkan hari Selasa berikutnya setelah tanggal tertentu (1 Februari 2020 di Eropa/Paris).
Meskipun demikian acara dimulai pada hari Rabu jika masih dalam zona waktu itu.
Menghitung acara untuk zona waktu Amerika/New_York acaranya seperti yang diharapkan.

Silakan periksa cuplikan di bawah ini. Temuan saya adalah:

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

Komentar yang paling membantu

Halo, masalah yang sama di sini
Untuk pengulangan: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Semua 3 komentar

Halo, masalah yang sama di sini
Untuk pengulangan: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"

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

Pembaruan: Saya pikir ini murni kebingungan saya seputar perilaku default rrule.js mengenai input UTC serta objek Tanggal JS.

Seperti yang diperoleh dari komentar lain, kebingungan ini tampaknya cukup umum:
(1) Bekerja dengan TZID
(2) Memasukkan DTSTART dalam format yang benar (lokal ke zona waktu, bukan UTC atau lokal ke komputer)
(3) Memasukkan tanggal yang tepat ke rrule.between() . Jika mendeklarasikan TZID, sama seperti Anda harus memijat tanggal ketika mereka keluar - menggunakan DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true }) , Anda harus memijat tanggal masuk ke between() (kemungkinan after/before sebagai baik) menggunakan DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true }) .

Terlepas dari masalah saya dengan dokumentasi, dan frustrasi seputar perilaku tidak berdokumen, saya sangat bersyukur perpustakaan ini ada. Terima kasih kepada pencipta dan semua pengelola dan kontributor. Sama seperti luxon tumbuh dari pelajaran dari moment , saya pikir iterasi berikutnya dari perpustakaan rrule akan dibangun di atas bahu rrule.js .

"Masalah" asli yang diposting, abaikan apa yang saya katakan di bawah.
Juga mengalami apa yang tampaknya menjadi masalah ini juga.

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

Ini mengembalikan daftar tanggal yang terjadi pada hari Kamis.
Saya telah memastikan bahwa DTSTART adalah UTC.

Acara yang dimaksud terjadi pada hari Jumat pukul 18:00-0600 (waktu pegunungan), yang sama dengan Sabtu 00:00-UTC, tetapi rrule.between() aneh mengembalikan waktu @ Kamis 18:00-0600.

Saya dengan senang hati akan mencoba membedah kode untuk melihat di mana/bagaimana masalah ini terjadi. Jika ada yang lebih akrab dengan basis kode memiliki beberapa tip untuk mengarahkan saya ke arah yang benar, beri tahu saya, terima kasih!

@davidgoli Hai David! Saya telah bekerja dengan rrule, selama 5 hari terakhir dan tidak tahu cara bekerja dengan zona waktu. Jika saya memasukkan waktu pada jam 9 malam, waktu akan dikonversi menjadi jam 4 pagi waktu UTC. Ini menyebabkan masalah ketika saya ingin mengatur acara berulang pada hari-hari tertentu, katakanlah hari Jumat. Jadi itu berulang pada hari Jumat jam 4 pagi, dan ketika itu diterjemahkan kembali ke zona waktu saya, maka itu adalah Kamis jam 9 malam ketika saya menginginkannya pada hari Jumat. Apakah Anda punya saran untuk ini? Saya mencoba dengan tzid tetapi saya juga tidak bisa membuatnya berfungsi. Tidak yakin bagaimana saya harus memasukkan Luxon? Saya telah mengunduh paket.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

anthwinter picture anthwinter  ·  11Komentar

zeluspudding picture zeluspudding  ·  11Komentar

marcoancona picture marcoancona  ·  22Komentar

agordeev picture agordeev  ·  16Komentar

maconfr picture maconfr  ·  6Komentar