用于创建重复事件的模式

时间:2011-01-24 14:38:16

标签: design-patterns

我偶尔会遇到一些功能,如果我在其中加入一些反复出现的情况会更好。

为了说清楚,让我使用一个已知的例子。在谷歌日历中,当我设置一个活动时,我们每个星期一都会重复播放,它会在每个星期一显示。我可以继续推进这几周,它将展示这一事件。

我真的不相信他们会在每个星期一在数据库中创建事件直到永恒:-),也不会创建它直到一些遥远的年份。

我想知道是否有一些众所周知的做这种事情的模式或任何最佳实践指南。

谢谢。

2 个答案:

答案 0 :(得分:16)

就我而言,从数据建模的角度来看,Martin Fowler在how to describe recurrences上有明确的词。一旦捕获了重复,您只需提供代码来检索给定日期(时间)的事件。

答案 1 :(得分:1)

这个问题已经有一段时间了,但我一直在寻找答案;一些简单的东西,可以处理所有最常见的方法。具体来说,如何将这些日期存储在关系数据库中。

我正在考虑,但尚未实施以下解决方案:

表:时间表

编号

名称

开始日期

结束日期

DayOfYear(可以是1-365中的任何数字序列)

DayOfMonth(可以通过1-31的任何数字序列)

月(1-12的任何序列)

DayOfWeek(1-7的任何序列)

WeekOfMonth(1-5的任何序列)

SkipInterval(smallint)

排除(很多2Many关系回到此表)

示例:

其他所有值均为零。

劳动节:StartDate = 9/1/2013,DayOfWeek = 2(星期一),月= 9,WeekOfMonth = 1

情人节:StartDate = 2013年2月14日,DayOfMonth = 14,Month = 2

每个月的每个第三个星期五:StartDate = 9/20/2013,DayOfWeek = 6,WeekOfMonth = 3

每隔一个星期五:StartDate = 10/4/2013; DayOfWeek = 6,SkipInterval = 2

每周工作日:StartDate = 10/4/2013; DayOfWeek = 2-6

每一天:StartDate = 10/4/2013

每个星期一:StartDate = 10/7/2013,DayOfWeek = 2

排除可用于从活动计划中删除所有假期。 (假设所有假期都已进入,没有人会在感恩节工作,对吗?)。