你会如何存储可能的经常性时间?

时间:2009-01-09 22:38:32

标签: time calendar recurrence

我需要存储是否发生过一次,每天,工作日,每周,一周的某些日子,一月中的某些日子,这可能是数字或符号,例如每个月的第一个星期一,等等。

有什么建议吗?要查看的任何代码,数据结构或架构?

7 个答案:

答案 0 :(得分:8)

有复杂的解决方案和简单的解决方案。两个最简单的解决方案是:

  1. 将重复发生的事件延伸到某些固定数量的实例,或将来某个固定日期范围。将FK recurrence_id存储到指向重复描述的每个实例,并允许批量编辑和取消。

    预先调出扇出方法的优点是可以非常轻松地实现重复异常,这几乎肯定是您获得的第一个功能请求。

  2. 在显示时计算。计算机速度很快,根据您希望能够回答的有关数据的问题,计算日期范围内的所有事件通常很容易。您可以很聪明,并尝试在进行重复计算之前快速包围您的日期范围,或者您可以从开始日期强制它。

  3. 除此之外,您只需要一个存储重复规则的解决方案,该规则适用于您用于计算重复的任何内容。 (例如,如果您使用的是iCalendar启用库,那么您的架构是varchar(255),其中包含RRULE值)

    如果您不得不推出自己的重复计算器,并且希望保持简单,那么将每次,每周,每月或每年的重复次数限制在您的前80%使用案例中,并且非常容易计算。< / p>

    此时您的潜在重复架构如下所示:

    id
    recurrence_start
    recurrence_end
    type (daily|weekly|monthly|yearly)
    day_of_week (for weekly)
    month
    day_of_month
    

    坦率地说,复杂的解决方案可能不值得:)

答案 1 :(得分:3)

Martin Fowler写了a really great paper这个问题。你可以在runt找到很多相同的想法,这是一个处理时态表达式的Ruby库。

答案 2 :(得分:1)

尝试一个具有日程安排功能的开源项目?

一些调度接口/定义

http://tools.ietf.org/html/rfc4791

http://en.wikipedia.org/wiki/ICalendar

答案 3 :(得分:1)

这听起来像是一个“反复发生的事件”,例如在Outlook中。我会使用一个名为RecurrenceType的表来存储每个时间段(每天,每周等)。另一个名为Event woud的表按键指向RecurrenceType。然后可以使用标准日期函数计算大多数重复类型的未来日期。

答案 4 :(得分:1)

问题在于指定这样的间隔有无限的可能性。例如 - “如果日期是偶数,那么每隔一个月的第一个星期一,但不是4,而月份不是长年的2月”。你愿意走多远?最终,您只需要让用户键入一个布尔表达式,该表达式在事件要重复的日期计算为TRUE。从UI的角度来看并不是很好。

您应该决定系统的一些限制。一旦你知道了这些,其余的应该很容易 - 或者至少对SO负责。 :)

答案 5 :(得分:1)

此处描述的架构捕获重复日期

http://github.com/bakineggs/recurring_events_for

答案 6 :(得分:0)

a related, useful SO thread上提到过,但如果您正好使用Ruby,那么这是一个很好的,积极维护的Runt替代方法ice_cube。你还没有提到你的存储后端要求是什么,但是对于数据库架构,@ kellan和前面提到的一些线程是很好的开始。