这里接受的答案太复杂了。例如,如果事件每 5 天发生一次,则 5 存储在 freq_interval 中,但如果每 5 周发生一次,则 5 存储在 freq_recurrence 中。最大的问题是 freq_interval 意味着三个不同的东西,具体取决于 freq_type 的值(每日重复出现之间的天数,每月重复出现的日期,或每周或每月相对的星期几)。此外,当 1,2,4,8... 类型序列不必要且无用时,使用它。例如,freq_relative_interval 只能是“其中之一” 可能的值。这与下拉框或单选按钮类型输入一致,而不是可以选择多个选项的复选框类型输入。对于编码和人类可读性,这个序列会妨碍并且仅使用 1,2,3,4... 更简单,更有效,更合适。最后,大多数日历应用程序不需要次日间隔(事件在一天内发生多次 - 每隔这么多秒、几分钟或几小时)。
但是,话虽如此,这个答案确实帮助我完善了我如何做到这一点的想法。在将它与其他文章混合并匹配之后,从我在 Outlook 日历界面和其他一些来源中看到的内容来看,我想出了这个:
重复
0=不重复
1=每天
2=每周
3=每月
recurs_interval
这是重复之间的周期数。如果事件每 5 天重复一次,这将有 5,recurs 将有 1。如果事件每 2 周重复一次,这将有 2,recurs 将有2.
recurs_day
如果用户选择每月类型重复,则在每月的给定日期(例如:10 日或 14 日)。这有那个日期。如果用户没有选择每月或每月的特定日期重复,则该值为 0。否则值为 1 到 31。
recurs_ordinal
如果用户选择了每月类型的重复,但选择了序数类型的日期(例如:第一个星期一、第二个星期四、上个星期五)。这将具有该序数。如果用户没有选择这种重复类型,则值为 0。
1=第一个
2=秒
3=第三
4=第四
5=最后一个
recurs_weekdays
对于每周和每月顺序重复,这将存储重复发生的工作日。
1=星期日
2=星期一
4=星期二
8=星期三
16=星期四
32=星期五
64=星期六
所以,例子:
因此,每 4 周的周六和周日将是
- recurs = 2 ==> 每周重复
- recurs_interval = 4 ==> 每 4 周
- recurs_weekdays = 65 ==>(星期六=64 + 星期日=1)
- recurs_day 和 recurs_ordinal = 0 ==> 未使用
同样,每 6 个月的第一个星期五是
- recurs = 3 ==> 每月重复
- recurs_interval = 6 ==> 每 6 个月
- recurs_ordinal = 1 ==> 在第一次出现时
- recurs_weekdays = 32 ==> 周五
根据另一个字段的值,拥有一个表示三种完全不同的事物的字段与此无关。
在用户界面方面,我让用户指定日期、开始时间和结束时间。然后,他们可以指定是否需要除无之外的重复类型。如果是这样,该应用程序会扩展网页的相关部分,为用户提供上述内容所需的选项,看起来很像 Outlook 选项,除了在每日重复下没有“每个工作日”(这与每个星期一至星期五每周重复一次),并且没有每年重复一次。如果有重复,那么我还要求用户指定一个在今天一年内的结束日期(用户希望这样,并且它简化了我的代码) - 我不做无休止的重复或“在 # 之后结束# 次。”
我将这些字段与用户选择一起存储在我的事件表中,并将其展开到包含所有事件的时间表表中。这有助于碰撞检测(我实际上是在做一个设施预订应用程序)和编辑个别事件或重构未来事件。
我的用户都在 CST,为此我感谢上帝。现在这是一个有用的简化,如果将来用户群要扩大到这个范围之外,那么我可以弄清楚如何处理它,作为一个很好的分离任务。
更新
自从我第一次写这篇文章以来,我确实在“每个工作日”中添加了每日发生次数。我们的用户很难想到您可以将每周重复用于从一周的星期四到下周的星期二发生的事件,并且仅在工作日发生。即使他们已经有另一种方法可以做到这一点,对他们来说拥有这个更直观。