反復ルール定義 (RFC2445) の質問
-
20-08-2019 - |
質問
Google の RFC2445 実装を使用しています (http://code.google.com/p/google-rfc-2445/) 繰り返しルールの場合。1 月 30 日から始まる MONTHLY 繰り返しを定義すると、30 日未満の月 (つまり 2 月) は完全にスキップされます。したがって、Google API は 1 月 30 日、3 月 30 日、4 月 30 日などを返します。良くない。私はそれが返されることを期待します:1月30日、2月28日、3月30日、4月30日。
同様に、1 月 31 日の開始日を選択した場合、31 日未満の月はスキップされます。
これは、RFC2445 仕様に従って正しい場合もあれば、バグである場合もあります。どう思いますか?
私の主な質問は、「毎月 30 日に繰り返す」というルールを定義する方法はあるのかということです。または 30 日が存在しない場合は月の末日。」そんなことはないと思います。助言がありますか?
前もって感謝します。
よろしく、コーマック
解決
答えは:= MONTHLY FREQ; BYMONTHDAY = 28,29,30; BYSETPOS = -1に変換「毎月30日に再発、または月の最終日30日が存在しない場合は」ます。
他のヒント
RFC がこれらの日付をスキップしているという意見は正しいようです。もしあなたの DTSTART
は 1 月 31 日ですが、日付を指定しません BYMONTHDAY
繰り返しルールで (または BYMONTHDAY
が 31 日である場合)、そのような日がない月は単純にそのルールを無視します。
利用可能な範囲を超えているBYXXXルールパーツの値が見つかった場合(つまり、2月にbymonthday = 30)、それらは単に無視されます。
しかし, に -1 を指定できるはずです。 BYMONTHDAY
そして、それが何であれ、月の最終日を使用するようにします。
bymonthdayルールパーツは、月の日のリストを分離したコンマ文字(ASCII 104)を指定します。有効な値は 1 ~ 31 または -31 ~ -1 です。たとえば、-10はその月の最終日から10番目を表します。
まあ、それ自身この RFC 2445を見て、それは間違いなく行動ますようですシーイングが正しいRE:
BYxxxルールの一部の値が利用可能範囲(2月中= 30すなわち、BYMONTHDAY)を超えている検出された場合は、は、単に無視されます。
私は考えることができる唯一の解決策は、2月の最後の日のために、つまり、毎月30日に1つ、別の複数の再発ルールを使用することです。