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

tav*_*ier 3 datetime exchange-server activesync c#-4.0 nodatime

任何人都可以告诉我根据事件发生次数和事件发生的模式计算重复事件的结束日期的最佳方法.

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

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

Jon*_*eet 6

(这不是一个能够以任何方式为您提供完整解决方案的答案,但希望它是朝着正确方向迈出的一步.)

祝好运.我参与过ActiveSync实现,而经常发生的事件从根本上是痛苦的.你需要考虑各种角落案例 - 如果每个月30日发生一些事情,2月会发生什么?如果它发生在凌晨1点30分,时钟在事件的时区前进或后退,那么1.30am在特定的一天发生0或2次会发生什么?

Noda Time可以为此提供帮助,但它不能提供完整的解决方案,部分原因是所有要求都会有很大变化.

你需要知道的是重要的类型LocalDate,并LocalDateTime提供时区中立的日期/时间,和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 month不一样x + 2 months
  • 如果/当您的行为让您感到惊讶时,回过头来询问具体问题.我们在Noda Time上工作的人不是很多,但问题往往很快得到回答:)