如何使用事件来计算 eas 中重复事件的结束日期

Posted

技术标签:

【中文标题】如何使用事件来计算 eas 中重复事件的结束日期【英文标题】:How can I use the occurrences to calculate the end date of a recurring event in eas 【发布时间】:2014-12-02 08:44:39 【问题描述】:

谁能告诉我根据事件发生的次数和事件发生的模式来计算重复事件的结束日期的最佳方法。

例如: 我有一个活动的开始日期为 2014 年 7 月 10 日(星期二),每周星期二发生。此事件将在发生 10 次后结束(例如)。所以,我的方法应该将结束日期返回为:12/09/2014

该方法还应考虑更复杂的情况,例如假设事件是否在每年 10 月的第一个星期一发生并且总共发生 10 次。

【问题讨论】:

【参考方案1】:

(这不是一个无论如何都能为您提供完整解决方案的答案,但希望这是朝着正确方向迈出的一步。)

祝你好运。我从事过 ActiveSync 的实施,经常发生的事件从根本上来说是痛苦的。你需要考虑各种极端情况——如果每个月的 30 日都有事情发生,那么 2 月会发生什么?如果它发生在凌晨 1.30,并且时钟在事件所在的时区中向前或向后移动,使得 1.30am 在某一天发生 0 或 2 次,会发生什么情况?

Noda Time 可以帮助解决这个问题,但它没有提供完整的解决方案,部分原因是所有要求都会有很大差异。

您需要了解的重要类型是 LocalDateLocalDateTime 以提供与时区无关的日期/时间,Period 表示非必要固定的时间段,例如“1个月”。这将有助于“增加一周”之类的事情——LocalDate 上有一些方法可以用于“此日期之后的下周一”之类的事情。对于“每周,周一和周三”的活动来说,它变得更加困难 - 您需要逐步了解这些周,计算出在特定一周内发生了哪些日子,直到您完成了所有您需要的活动。

Noda Time 2.0 具有“调节器”的概念,这将使诸如“10 月的第一个星期一”之类的事情变得更加简单,但是您需要做的所有事情都可以在 Noda Time 1.3 中完成。 (不要等待 Noda Time 2.0,我预计至少要再过 6 个月才能发布。)

我认为我最强烈的建议是:

保持简单。首先专注于获得正确的结果,然后制定您需要的任何优化。 (例如,不要试图“猜测”事件的第 100 个实例何时会发生 - 用简单的步骤逐步完成 100 个实例会更慢,但会让你得到正确的答案。一定要测量性能,但要确保你在优化之前进行良好的测试。) 引入您自己的类型以准确地表示您对事件的了解。当然,在它们匹配的地方使用 Noda Time 类型,但不要仅仅因为它非常就像你想要表示的那样而试图使用现有类型。细微的差异最终会伤害到你。 确保您知道您真正想要的结果是什么。编写很多个测试。日期和时间工作是一个自然而然的面向数据的领域,因此投资于尽可能简单地为您应该考虑的所有极端情况编写测试。 (而且您真的应该考虑它们。特别注意闰年和时区。) 请注意,时间算术不遵循正常的算术规则 - x + 1 month + 1 monthx + 2 months 不同 如果/当行为让您感到惊讶时,回来在这里提出具体问题。我们在野田时间工作的人并不多,但问题往往会很快得到回答:)

【讨论】:

删除我微不足道的答案以支持这个:) 现在我在为我们系统的 Exchange 同步部分添加定期约会而苦苦挣扎时感觉好多了。如果 Jon Skeet 说这很难,那不只是我是个懦夫!

以上是关于如何使用事件来计算 eas 中重复事件的结束日期的主要内容,如果未能解决你的问题,请参考以下文章

基于日期开始和结束在 FullCalendar 上重复事件

重复事件数据库模型

FullCalendar 5 - 如何获取事件系列的结束日期 - eventClick?

设计不重叠的日期时间事件

如何使用图形 api/FQL 从 facebook 获取过去/结束的公共事件?

每周在指定日期重复活动,直到特定日期