2014-07-24 49 views
1

我想解析一個RRULE,並顯示重複事件有效的月中幾周。我查看了RFC2445文檔(http://www.ietf.org/rfc/rfc2445.txt),但並不清楚。RRULE解釋使用BYDAY和BYSETPOS

我知道實例的規則:

RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,FR,WE;BYSETPOS=10,11,12,7,8,9,1,2,3,4,5,6 

是對週三,週四,週五在每月的第一,第二,第三和第四周。

RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TU,MO;BYSETPOS=3,4,5,6; 

是對週一和週二在每月的第2和第3周。

RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,WE;BYSETPOS=-1,-2 

是對週三和週四在上週的一個月。

我通過其他程序生成這些,但我不知道它是如何實際生成它們。

因此,我遇到的問題是瞭解BYSETPOS如何描述一個月的再次發生周。最終的目標是要能夠解析RRULE如上述和顯示在像這樣:

對於:RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,FR,WE;BYSETPOS=10,11,12,7,8,9,1,2,3,4,5,6

顯示:Thur,Friday,Wed on week:1,2,3,4

對於:RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TU,MO;BYSETPOS=3,4,5,6;

顯示:Tues, Monday on week:2,3

爲:RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,WE;BYSETPOS=-1,-2

顯示:Whu,Wed on last week

最好的解決方案是在Objective-C中的一個字符串,但是如果它是另一種類似C的語言,我可以算出它。即使只是解釋如何BYSETPOS與BYDAY的作品將是偉大的。

回答

4

因此,我遇到的問題是瞭解BYSETPOS如何描述一個月的再次發生周。

BYSETPOS不代表星期,只是計算了與規則其餘部分相對應的實例後的第n個實例。例如,FREQ=MONTHLY;INTERVAL=1;BYDAY=TU,MO對應於每個月的每個星期一和星期二。因此,對於每個月,您首先計算一組(例如,如果您選擇2014年7月,則爲9個條目)。然後BYSETPOS爲您提供您應該保留的集合中的「索引」,-1,-2表示集合中的最後2個條目。

繼續以2014年7月爲例,基本規則將返回以下設置:(7月1日,7日,8日,14日,15日,21日,22日,28日和29日)。給定BYSETPOS = 1,2,-1,-2,我們將保留7月1日,7日,28日和29日。

你想看看http://tools.ietf.org/html/rfc5545,它廢棄了RFC2245,並且對遞歸規則有更詳細的描述。

+0

對不起,我想我還是有點困惑。 因此,2014年7月,TU,Mo的設置爲: 1,2,2,3,3,4,4,5,5 RRULE FREQ = MONTHLY; INTERVAL = 1; BYDAY = TU,MO; BYSETPOS = 1,2,-1,-2 因此-1&-2將抓取5,5,表明TU和MO是該月的第5周。 但我仍然沒有看到它在說: RRULE FREQ = MONTHLY; INTERVAL = 1; BYDAY = TU,MO; BYSETPOS = 1,2,-1,-2 我已經爲第一和第二這個月的最後一個星期,這給了我幾個星期1,2和5,5。 –

+0

編輯我的反應與BYSETPOS = 1,2,-1,-2例如2014年7月 – arnaudq

+0

我可以澄清'BYDAY = MO; BYSETPOS = -1'是否與'BYDAY = -1MO'相同嗎? – u01jmg3