Time 您将如何存储可能重复出现的时间?

Time 您将如何存储可能重复出现的时间?,time,calendar,recurrence,Time,Calendar,Recurrence,我需要存储某件事是否发生过一次,每天、工作日、每周、一周中的某些日子、一个月中的某些日子,这些日子可能是数字的,也可能是象征性的,比如每个月的第一个星期一,等等 有什么建议吗?要查看任何代码、数据结构或模式吗?尝试一个具有调度功能的开源项目 一些调度接口/定义 及 这听起来像是Outlook中的“重复事件”。我将使用一个名为RecurrenceType的表来存储每个时间段(每日、每周等),另一个名为Event的表将按键引用RecurrenceType。然后,可以使用标准日期函数计算大多数重复类

我需要存储某件事是否发生过一次,每天、工作日、每周、一周中的某些日子、一个月中的某些日子,这些日子可能是数字的,也可能是象征性的,比如每个月的第一个星期一,等等


有什么建议吗?要查看任何代码、数据结构或模式吗?

尝试一个具有调度功能的开源项目

一些调度接口/定义


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

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

  • 将重复发生的事件扇出到某个固定数量的实例,或将来某个固定日期范围。在每个实例中存储一个FK recurrence_id,该实例指向循环的描述,并允许批量编辑和取消

    预计算扇出方法的优点是,它使得实现重复异常非常容易,这几乎肯定是您得到的第一个功能请求

  • 在显示时间计算。计算机速度很快,根据您希望能够回答的有关数据的问题,计算一个日期范围内的所有事件通常非常容易。你可以聪明一点,在进行定期计算之前,尝试快速地将日期范围括起来,或者从开始日期开始强制执行

  • 除此之外,您只需要一个存储递归规则的解决方案,该规则适用于您用来计算递归的任何东西。(例如,如果您使用的是iCalendar启用库,则您的模式为varchar(255),其中包含RRULE值)

    如果您必须使用自己的循环计算器,并且希望保持简单,那么将循环次数限制为每天、每周、每月或每年,可以覆盖您的第一个80%的用例,并且非常容易计算

    此时,您的潜在重复模式类似于:

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

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

    问题是,指定这样的间隔有无限的可能性。例如:“每隔一个月的第一个星期一,如果日期是偶数,但不是4,并且这个月不是一年中的二月”。你愿意走多远?最终,您只需让用户键入一个布尔表达式,该表达式在事件再次发生的日期计算为TRUE。从用户界面的角度来看不是很好


    您应该确定系统的一些限制。一旦你知道了这些,剩下的就应该很简单了——或者至少应该对此负责

    马丁·福勒写了这篇文章。您可以在一个处理时态表达式的Ruby库中找到许多与他讨论的相同的想法。

    这里描述的模式捕获了重复出现的日期


    上面提到了它,但如果您碰巧使用Ruby,它是一个很好的、主动维护的Runt替代品。您没有提到您的存储后端需求是什么,但是对于数据库模式,@kellan和前面提到的线程上的一些都是很好的开始。

    Fowler的论文清晰易读,但它没有处理规则的例外情况,IMO是此设计模式的主要问题之一……嘿,kellan,在使用您提供的定期模式时,如何实现事件的范围(开始日期和结束日期)?有什么想法吗?我在设计这样的东西时遇到了很多麻烦。谢谢