如何将假期的iCal Feed移至相邻的工作日?

时间:2013-02-11 02:56:01

标签: icalendar rfc2445 rfc5545

我正在努力为工作假期制作一个iCal Feed(RFC 2445),不需要每年更新,通过按照定义列出假期,而不是在特定年份发生的假期。

假期Memorial day(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日周末的日假?

2 个答案:

答案 0 :(得分:1)

你应该知道,即使谷歌日历遵循RFC2445,它已经被RFC5545淘汰,这使得EXRULE已经过时(deprecated features from 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

谷歌日历支持它,但看起来像雅虎和hotmail / outlook.com不支持,所以需要创建2个事件(每个RRULE一个)。如果需要,使用RELATED-TO属性可以帮助跟踪他们的关系。

答案 1 :(得分: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

与原始活动一起(如果您不希望实际假期显示在您的Feed中,您可以同样为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日历愉快地消费并了解我的example iCalendar feed。不幸的是,当前的iCal(以及从导入此Feed的Google日历同步的iOS设备)有点小错误(提交为 bug 13188350 [链接可能仅适用于记者]),并且无法应用指定的工作日过滤器。< / p>

但希望这也很快得到修复。