使用 ical.net 支持夏令时的重复事件
Recurring events with daylight savings time support using ical.net
实现自动调整 DST 的重复日期的最佳方法是什么?例如,即使 DST 生效,事件也应在美国东部标准时间每天上午 10 点重复发生,并且不应向后或向前跳转 1 小时。
目前我将日期存储为 UTC,但我也可以访问原始时区。
在日期和时间编程的一般情况下,如果您的目标时区不是 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 进行时区转换。)
实现自动调整 DST 的重复日期的最佳方法是什么?例如,即使 DST 生效,事件也应在美国东部标准时间每天上午 10 点重复发生,并且不应向后或向前跳转 1 小时。
目前我将日期存储为 UTC,但我也可以访问原始时区。
在日期和时间编程的一般情况下,如果您的目标时区不是 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 进行时区转换。)