C#学习教程:在C#中计算重复日期的正确方法分享


在C#中计算重复日期的正确方法

在我的项目中,我需要计算重复事件的日期。 一开始我只有一个开始日期/时间以及该事件必须重复的信息:

Every Day Every Week Every 2 Weeks Every 3 Weeks Every Month Every 2 Months ... 

这样做的正确方法是什么? 它应该可以正常使用不同的时区和日节省时间设置。 我想我应该将日/周/月添加到本地DateTime,然后将其转换为UTC。 但我不确定这一点。 如果我添加几天会发生什么,这将是我们需要向前调整我们的时钟一小时的时间。 在这种情况下,此时间不存在。

下面是我写的代码,但我不确定它在每种情况下都能正常工作:

 private static List FindOccurrences(DateTime localStart, Repeat repeat, int occurrences) { var result = new List { localStart }; switch (repeat) { case Repeat.Daily: for (int i = 1; i <= occurrences; i++) result.Add(localStart.AddDays(i)); break; case Repeat.Every2Weeks: for (int i = 1; i <= occurrences; i++) result.Add(localStart.AddDays((7 * 2) * i)); break; ... } return result; } public List CreateRepeating(string timeZone, Repeat repeat, int repeatEnds, DateTime localStart, int eventDuration) { var events = new List(); var occurrences = FindOccurrences(localStart, repeat, repeatEnds); foreach (var occurrence in occurrences) { var item = new Event(); item.Start = occurrence.ToUtcTime(timeZone); item.End = occurrence.ToUtcTime(timeZone).AddMinutes(eventDuration); events.Add(item); } return events; } 

PS:所有日期都以UTC格式存储在数据库中。

安排或计算未来事件的日期,尤其是重复发生的事件,是一个非常复杂的主题。 虽然从其他语言的角度来看,我已经写过几次这样的文章(参见: 1,2,3,4 )。

我担心这个主题过于宽泛,无法为您提供准确的代码。 详细信息将特定于您的应用程序。 但这里有一些提示。

一般来说:

部分答案。 我宁愿将实现更改为

  public enum TimePeriod { None = 0, Day = 1, // Just week, no "two weeks, three weeks etc." Week = 2, Month = 3 } public static class Occurrencies { // May be you want to convert it to method extension: "this DateTime from" public static IEnumerable FindInterval(DateTime from, TimePeriod period, int count) { while (true) { switch (period) { case TimePeriod.Day: from = from.AddDays(count); break; case TimePeriod.Week: from = from.AddDays(7 * count); break; case TimePeriod.Month: from = from.AddMonths(count); break; } yield return from; } } } 

使用:

上述就是C#学习教程:在C#中计算重复日期的正确方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

  // Get 5 2-week intervals List intervals2Weeks = Occurrencies .FindInterval(DateTime.Now, TimePeriod.Week, 2) .Take(5) .ToList(); // Get 11 3-month intervals List intervals3Months = Occurrencies .FindInterval(DateTime.Now, TimePeriod.Month, 3) .Take(11) .ToList(); 

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031645.html

发表评论

邮箱地址不会被公开。 必填项已用*标注