我正在使用Groovy/Java日历类型的应用程序,该应用程序允许用户输入具有开始日期和可选重复发生的事件。如果是重复发生的事件,则可能会再次发生:

每月

  • (与开始日期
  • 对应的月份)
    每周的某天的
  • 对应于开始日期
  • 与开始日期
  • 相对应的一周中的某天的每2周一次
  • 等。

  • 我最初计划使用Google日历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
      }
    }
    

    这种逻辑看似合理,但是在考虑所有异常情况时(例如,如何处理在2月首次发生于1月31日的每月重复发生的事件),实际上将花费很多精力。

    有没有可以帮助我实现这一目标的库?某些细节将不胜感激(例如,“使用Joda时间”将不会获得任何积分)。

    谢谢,
    大学教师

    最佳答案

    RFC-2445(基本上是iCal规范)中合理地指定了所需的重复规则类型。弄清楚这个正确的细节可能会涉及很多。我建议为此使用google-rfc-2445库,或者该规范的另一种实现,例如iCal4J

    10-05 18:01
    查看更多