0

我正在尝试为不需要每年更新的工作假期制作 iCal 提要( RFC 2445 ),方法是根据其定义列出假期,而不是在特定年份出现的日期。

阵亡将士纪念日(五月的最后一个星期一)这样的假期当然不需要任何特殊待遇

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

它在谷歌日历、outlook.com(/hotmail/...)、雅虎日历和从谷歌日历同步的 iOS 设备上就像一个魅力。

更新:美国新年

这将是 2 RRULE 的组合(RFC 说SHOULD NOT occur more than once这似乎留下了 2 RRULE 事件的可能性:

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 一个)。如果需要,使用 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(以及从导入此提要的 Google 日历同步的 iOS 设备)有一些错误(归档为 错误 13188350 [链接可能仅适用于记者]),并且无法应用指定的工作日过滤器。

但希望这也能很快得到解决。

于 2013-02-11T02:56:01.103 回答