Rrule: 平日1日シフトを使用した定期的なイベント

作成日 2020年03月22日  ·  3コメント  ·  ソース: jakubroztocil/rrule

  • [x]以前に重複について既存の問題を調べたことがあることを確認します
    新しいものを作成する
  • [x]問題を再現するコードサンプル。 必ずすべての入力値を含めてください
    正確なRRule文字列や日付などを使用しています。
  • [x]期待される出力
  • [x]実際の出力
  • [x]使用しているrruleのバージョン

    • 2.6.4

  • [x]オペレーティングシステム

    • Linux

  • [x]ローカルタイムゾーン(バグを示しているマシンのコマンドラインから$ 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示しています

全てのコメント3件

こんにちは、ここで同じ問題
再発の場合: "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 })ます。

ドキュメントに関する問題や、ドキュメント化されていない動作に対するフラストレーションにもかかわらず、このライブラリが存在することに非常に感謝しています。 作成者とすべてのメンテナと貢献者に感謝します。 luxonmomentから学んだ教訓から生まれたように、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をどのように組み込むべきかわかりませんか? パッケージをダウンロードしました。

このページは役に立ちましたか?
0 / 5 - 0 評価