rrule
のバージョン$ date
を実行します)特定の日付(ヨーロッパ/パリでは2020年2月1日)の次の火曜日を取得しようとしています。
それでも、まだそのタイムゾーンにある場合、イベントは水曜日に始まります。
タイムゾーンAmerica / New_Yorkのイベントの計算では、イベントは期待どおりです。
以下のスニペットを確認してください。 私の調査結果は次のとおりです。
// 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())
こんにちは、ここで同じ問題
再発の場合: "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"
rule.all()
はTU,WE,TH,FR,SA
示しています
更新:これは、UTC入力とJSDateオブジェクトに関するrrule.jsのデフォルトの動作に関する純粋な混乱だったと思います。
他のコメントから収集したように、この混乱は非常に一般的なようです。
(1)TZIDの操作
(2)DTSTARTを正しい形式で入力する(UTCまたはコンピューターに対してローカルではなく、タイムゾーンに対してローカル)
(3)正しい日付をrrule.between()
ます。 TZIDを宣言する場合は、出てきた日付をマッサージする必要があるのと同じように、 DateTime.fromJSDate(date).toUTC().setZone('local', { keepLocalTime: true })
を使用して、 between()
入る日付をマッサージする必要があります(おそらくafter/before
としてよく) DateTime.fromMillis(posixTime).setZone('utc', { keepLocalTime: true })
ます。
ドキュメントに関する問題や、ドキュメント化されていない動作に対するフラストレーションにもかかわらず、このライブラリが存在することに非常に感謝しています。 作成者とすべてのメンテナと貢献者に感謝します。 luxon
がmoment
から学んだ教訓から生まれたように、rruleライブラリの次の反復はrrule.js
肩の上に構築されると思います。
元の投稿された「問題」、私が以下に言ったことを無視してください。
また、この問題のように見えることも経験しています。
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))
これにより、木曜日に発生する日付のリストが返されます。
DTSTARTがUTCであることを確認しました。
問題のイベントは金曜日の18:00-0600(山の時間)に発生します。これは土曜日の00:00-UTCと同じですが、 rrule.between()
奇妙なことに木曜日の18:00-0600に時間を返します。
喜んでコードを分析して、問題がどこでどのように発生しているかを確認します。 コードベースに精通している人が私を正しい方向に向けるためのヒントを持っている場合は、私に知らせてください、ありがとう!
@davidgoliちょっとデビッド! 過去5日間、rruleを使用していますが、タイムゾーンの使用方法がわかりません。 時刻を午後9時に入力すると、UTC時刻の午前4時に変換されます。 これにより、特定の日、たとえば金曜日に定期的なイベントを設定したい場合に問題が発生します。 それで、それは金曜日の午前4時に繰り返され、それが私のタイムゾーンに戻されると、金曜日にそれが欲しかったのは木曜日の午後9時です。 これについて何か提案はありますか? tzidで試しましたが、それも機能しません。 Luxonをどのように組み込むべきかわかりませんか? パッケージをダウンロードしました。
最も参考になるコメント
こんにちは、ここで同じ問題
再発の場合:
"FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR;UNTIL=20200430T040000Z"
rule.all()
はTU,WE,TH,FR,SA
示しています