使用ical.net支持夏令时的重复活动

时间:2017-09-19 16:36:20

标签: c# .net icalendar ical-dotnet

实施自动调整DST的重复日期的最佳方法是什么?例如,即使在夏令时生效时,每天早上10点都会发生一次事件,并且不应该向后或向前跳1小时。

目前我将日期存储为UTC,但我也可以访问原始时区。

1 个答案:

答案 0 :(得分:1)

在日期和时间编程的一般情况下,如果您的目标时区不是UTC,则无法使用UTC作为起点来表达有关未来时间的规则。时区是社会政治的,规则也在变化。

为此,解决方案是用当地时区表达您的CalDateTime。完成后,GetOccurrences()将正确计算重复集。

var start = DateTime.Parse("2017-02-01 11:00");
var end = start.AddHours(1);
var dailyUntilSummer = new RecurrencePattern(FrequencyType.Daily, 1)
{
    Until = DateTime.Parse("2017-07-01 12:00"),
};
var calendarEvent = new Event
{
    Start = new CalDateTime(start, "America/New_York"),
    End = new CalDateTime(end, "America/New_York"),
    RecurrenceRules = new List<IRecurrencePattern> { dailyUntilSummer },
};

var calendar = new Calendar();
calendar.Events.Add(calendarEvent);

var occurrences = calendar.GetOccurrences(start, start.AddMonths(6))
    .Select(o => new {Local = o.Period.StartTime, Utc = o.Period.StartTime.AsUtc})
    .OrderBy(o => o.Local)
    .ToList();

如果您在occurrences之后设置断点,并查看其内容,您将在3月12日看到UTC时间从16:00到15:00,而当地时间保持稳定。 3月12日,当时钟发生变化时,America / New_York从UTC-5变为UTC-4:

(在幕后,ical.net使用NodaTime进行时区转换。)