0

特定の年に発生する日付ではなく、定義ごとに休日をリストすることにより、毎年更新する必要のない休日のiCalフィード( RFC 2445 )を作成しようとしています。

もちろん、メモリアルデー(5月の最終月曜日)のような休日は、それ以外の特別な扱いは必要ありません。

BEGIN:VEVENT
DTSTAMP:20130210T211949Z
UID:20130210-memorial-day@usa.gov
DTSTART;VALUE=DATE:20130527
DTEND;VALUE=DATE:20130527
SUMMARY:Memorial Day
RRULE:FREQ=YEARLY;BYMONTH=5;BYDAY=-1MO;WKST=SU
END:VEVENT

...しかし、正月のような日付ベースの休日になると、1月1日の週末の日をどのようにエンコードするのでしょうか。

4

2 に答える 2

1

GoogleカレンダーはRFC2445に準拠していますが、RFC5545によって廃止され、EXRULEが廃止されたことに注意してください(RFC2445の非推奨機能)。

英国の新年の場合、それは次のとおりです。

BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:pyICSParser
BEGIN:VEVENT
DTSTART;VALUE=DATE:20070101
RRULE:FREQ=YEARLY;BYMONTH=1;BYDAY=MO,TU,WE,TH,FR;BYMONTHDAY=1,2,3;BYSETPOS=1
UID:UIDnewyear_SO14805248@stackeroverflow.com
DTSTAMP:19970714T170000Z
SUMMARY: new year
END:VEVENT
END:VCALENDAR

これは、Googleカレンダー、outlook.com(/ hotmail / ...)、yahooカレンダー、およびGoogleカレンダーから同期するiOSデバイスで魅力のように機能します。

更新:米国の新年の場合

それは2RRULEの組み合わせになります(RFCによるSHOULD NOT occur more than onceと、イベントごとに2RRULEの可能性が残っているようです。

RRULE:FREQ=YEARLY;BYMONTH=1;BYDAY=MO,TU,WE,TH,FR;BYMONTHDAY=1,2;BYSETPOS=1
RRULE:FREQ=YEARLY;BYMONTH=12;BYDAY=FR;BYMONTHDAY=-1

Googleカレンダーはそれをサポートしていますが、yahooとhotmail / outlook.comはサポートしていないように見えるため、2つのイベントを作成する必要があります(各RRULEに1つ)。必要に応じて、RELATED-TOプロパティを使用すると、それらの関係を追跡するのに役立ちます。

于 2013-02-11T08:16:43.790 に答える
0

注:次の回答は、非推奨のRFCでそれを行う方法を示しています!誰かが必要になった場合に備えて、参考のために残しておきます。より有用な事実については、適切な答えを参照してください。

これを行うには、日付に対応する平日がある年のみを表示する、対応する毎年繰り返される隣接する金曜日と隣接する月曜日のルールを追加します。

BEGIN:VEVENT
DTSTAMP:20130210T211949Z
UID:20130210-new-years-day-less-1@usa.gov
DTSTART;VALUE=DATE:20121231
DTEND;VALUE=DATE:20121231
SUMMARY:New Year’s Day (moved from a Saturday)
RRULE:FREQ=YEARLY;BYMONTH=12;BYMONTHDAY=31
EXRULE:FREQ=YEARLY;BYMONTH=12;BYMONTHDAY=31;BYDAY=MO,TU,WE,TH,SA,SU
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20130210T211949Z
UID:20130210-new-years-day-plus-1@usa.gov
DTSTART;VALUE=DATE:20130102
DTEND;VALUE=DATE:20130102
SUMMARY:New Year’s Day (moved from a Sunday)
RRULE:FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=2
EXRULE:FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=2;BYDAY=TU,WE,TH,FR,SA,SU
END:VEVENT

元のイベント(実際の休日をフィードに表示したくない場合は、同様にこれをフィルタリングできます)と一緒に、BYDAY=MO,TU,WE,TH,FR休暇を移動する必要がなかった年に誤検知を取得することなく、すべての年をカバーします平日へ:

BEGIN:VEVENT
DTSTAMP:20130210T211949Z
UID:20130210-new-years-day@usa.gov
DTSTART;VALUE=DATE:20130101
DTEND;VALUE=DATE:20130101
SUMMARY:New Year’s Day
RRULE:FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1
END:VEVENT

Googleカレンダーは、私の例のiCalendarフィードを喜んで消費し、理解しています。現在のiCal(およびこのフィードをインポートしたG​​oogleカレンダーから同期されたiOSデバイス)は残念ながら少しバグがあり(バグ13188350 [リンクはおそらくレポーターに対してのみ機能します])、指定された平日フィルターを適用できません。

しかし、うまくいけば、それもすぐに修正されます。

于 2013-02-11T02:56:01.103 に答える