iCalendar仕様によると:
The "DTSTART" property defines the first instance in the recurrence set.
そして、これの例が含まれています:
Every other week on Monday, Wednesday and Friday until December 24,
1997, but starting on Tuesday, September 2, 1997:
DTSTART;TZID=US-Eastern:19970902T090000
RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
BYDAY=MO,WE,FR
==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
1,3,13,15,17
(1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
December 8,10,12,22
rrule.jsには、9月2日がオカレンスとして含まれていません。 rrule.jsでは、最初に発生するのは9月3日です。
これにプラス1。 RRuleはデモアプリの開始日/期間をまったく尊重していません
同意しました。これは、Google RFC 2445 javalibを扱うときに私を失望させました。
:+1:これは、標準(およびGoogleカレンダー、Apple(Mac OS / iOS / iCloud)カレンダーなどの準拠システム)の動作方法です。
@jkbrzt 、現在、rrule.jsはpythondateutilの機能に関連付けられています
RFCに記載されているのとは異なり、開始日時(dtstart)は、指定されたルールに適合しない限り、最初の繰り返しインスタンスではありません。
-dateutilドキュメント
これは、dateutilからの大きな逸脱のように思われますが、この場合は理にかなっているようです。 これには、ほとんどすべてのテストケースの変更が含まれます。 考え? 変更をサポートしますか?
@ hwangmoretimerrule.jsがRFCと異なるREADMEドキュメントへの変更をマージしました。ありがとうございます。 ええ、 rrule.js
準拠させることは非常に理にかなっています(この問題+ byday
キーワード引数)。 ただし、下位互換性が失われるため、十分に文書化する必要があります。
これにはまだバグがあると思います。 これはall()
では機能しますが、メソッドbetween
では機能しません。 以下の例では、readmeに従って、 RRuleSet
オブジェクトにdtstart
とrdate
します。
rruleSet
RRuleSet {_cache: Object, _rrule: Array[1], _rdate: Array[1], _exrule: Array[0], _exdate: Array[0]}
rruleSet.valueOf()
["RRULE:FREQ=YEARLY;DTSTART=20120122T000000Z;INTERVAL=1;WKST=0;BYMONTH=3;BYMONTHDAY=19;BYHOUR=13;BYMINUTE=39;BYSECOND=27", "RDATE:20120122T000000Z"]
rruleSet.all()[0]
Sat Jan 21 2012 16:00:00 GMT-0800 (PST)
rruleSet.between(startDatetime、endDatetime)
[Sat Mar 19 2016 13:39:27 GMT-0700 (PDT)]
メソッドall
の呼び出しの場合、返される日付は元のdtstart
一致しますが、 between
場合、デフォルトで現在の時刻に戻ります。
ここにもう少しコンテキストがあります。 私の知る限り、rrulesetは私が期待したのとは正反対のことをしています。 日付のリストを生成します。ここで、0番目の要素は元の目的のイベントの開始です。 しかし、それはが一連の日付に拡張される現在の時間です。 1月21日に日付のリストを取得する予定でしたが、現在の時刻(3月22日)を使用してrrulesetが「繰り返し」ました。
私はレポを引き出し、いくつかのテストでこれを絞り込もうとしていますが、アドバイスをいただければ幸いです。
dtstartでも同様の問題が発生しました。 https://stackoverflow.com/questions/54517101/rrule-not-setting-correct-time-if-dtstart-is-setを参照して
コンストラクターでdtstartを設定すると、.all()で正しい時刻が取得されますが、後でdtstartを設定すると、現在の時刻が取得されます。
私は、デフォルトでdtstart
が他のシステムとの一貫性を高めるために包括的であるべきであることに同意します。
現在の動作の微妙さを示すcodepenを作成しました: https ://codepen.io/arshaw/pen/qwEQNO?editors = 0010
デフォルトでは、
dtstart
は、他のシステムとの一貫性を高めるために包括的である必要があります。
同意しました。 今rruleのスピードを上げています。 これは時間の節約になりますが(ありがとうございます!)、この包括的な日付は、対処するためのカスタムロジックを必要とする奇妙なニュアンスを発行します。 これが更新されるのを見たいです。 現在の動作はpython-dateutilと一致していることを理解しましたが、奇妙な逸脱を永続させるのではなく、RFC標準と一致する動作を優先する必要があると思います。
また、以下のコメントごとに:
RRuleSetを使用し、dtstartをrdateとして追加することで、元の動作を取得できることに注意してください。
私が知る限り、これは多くのユースケースに必要な回避策の複雑さを大幅に過小評価しています。
たとえば、次のルールパラメータがあるとします。
new RRule({
freq: RRule.WEEKLY,
dtstart: new Date(Date.UTC(2020, 10, 1, 21, 0, 0)),
count: 10,
interval: 2,
byweekday: RRule.MO
})
これは、2020年11月1日日曜日の開始日で、「月曜日に2週間ごとに10回」に変換されます。
さて、開始日後の月曜日の最初のカレンダーは11月2日です...したがって、2の間隔で、生成されるイベントの日付は11月2日、11月16日、11月30日などになると予想されます。
ただし、 rrule
パッケージでは、代わりに11月9日、11月23日などの日付が表示されます。つまり、間隔全体が間違っており、1週間前にシフトしています。 これを修正することは、「RRuleSetを使用してdtstartをrdateとして追加する」ほど簡単ではありません。 このタイプの修正には、かなり多くの作業があります。
最も参考になるコメント
私は、デフォルトで
dtstart
が他のシステムとの一貫性を高めるために包括的であるべきであることに同意します。現在の動作の微妙さを示すcodepenを作成しました: https ://codepen.io/arshaw/pen/qwEQNO?editors = 0010