我正在研究Groovy/Java日曆類型的應用程序,該應用程序允許用戶輸入具有開始日期和可選的重複事件的事件。如果這是一個經常性的事件,它可能recurr:週期性事件邏輯
- 每月上對應於開始日期
- 在每週的那一週中的一天,一個月的日期對應的開始日期
- 每2周的那一週中的一天相當於起始日期
- 等
我原本計劃使用的谷歌日曆API來完成所有的復發邏輯,但事實證明這是一個巨大的PITA ,原因如果有人在意,我會進一步討論。
所以現在,我決定推出我自己的解決方案。給定一個日期,我想弄清楚這個日期是否會發生重複事件。我的邏輯(在僞代碼)將如下:
public boolean occursOnDate(def date, def event) {
def firstDate = event.startDate
if (firstDate > date) {
return false;
} else if (event.isWeekly()) {
return event.dayOfWeek() == date.dayOfWeek()
} else if (event.isMonthly()) {
return event.dayOfMonth() == date.dayOfMonth()
} else {
// At this point we know the event occurs every X weeks where X > 1
// Increment firstDate by adding X weeks to it as many times as possible, without
// going past date
return firstDate == date
}
}
這種邏輯看似合理,但實際上是相當多的努力來實現,當你考慮所有的怪異邊緣的情況下(例如,如何處理每月週期性事件發生在1月31日)。
有沒有可以幫我實施的圖書館?一些具體細節將受到高度讚賞(例如,不會因「使用喬達時間」而獲得獎勵)。
謝謝, 唐
類似的問題:[最新最好的Java日期重複模式計算器(http://stackoverflow.com/q/492055/642706) – 2014-06-27 01:10:36
這Martin Fowler的論文[重複事件的日曆(HTTP:/ /martinfowler.com/apsupp/recurring.pdf)可能會有用。 – 2014-06-27 01:11:36