C# 使用ical.net支持夏令时的重复事件

C# 使用ical.net支持夏令时的重复事件,c#,.net,icalendar,ical-dotnet,C#,.net,Icalendar,Ical Dotnet,实现自动调整DST的重复日期的最佳方法是什么?例如,即使DST有效,事件也应在美国东部时间每天上午10点再次发生,并且不应向后或向前跳1小时 目前,我将日期存储为UTC,但我也可以访问原始时区。在日期和时间编程的一般情况下,如果目标时区不是UTC,则不可能使用UTC作为起点来表示未来时间的规则。时区是社会政治的,规则也会改变 为此,解决方案是用本地时区表示CalDateTimes。完成此操作后,getoccurrencess()将正确计算重复集 var start = DateTime.Pars

实现自动调整DST的重复日期的最佳方法是什么?例如,即使DST有效,事件也应在美国东部时间每天上午10点再次发生,并且不应向后或向前跳1小时


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

在日期和时间编程的一般情况下,如果目标时区不是UTC,则不可能使用UTC作为起点来表示未来时间的规则。时区是社会政治的,规则也会改变

为此,解决方案是用本地时区表示
CalDateTime
s。完成此操作后,
getoccurrencess()
将正确计算重复集

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();
var start=DateTime.Parse(“2017-02-01 11:00”);
var end=start.ADDHERS(1);
var DailyUntillSummer=新的复发模式(FrequencyType.Daily,1)
{
直到=DateTime.Parse(“2017-07-01 12:00”),
};
var calendarEvent=新事件
{
开始=新的CalDateTime(开始,“美国/纽约”),
结束=新CalDateTime(结束,“美国/纽约”),
RecurrenceRules=新列表{DailyUntillSummer},
};
var calendar=新日历();
calendar.Events.Add(calendarEvent);
var事件=calendar.getEvents(开始,开始.添加月份(6))
.Select(o=>new{Local=o.Period.StartTime,Utc=o.Period.StartTime.AsUtc})
.OrderBy(o=>o.Local)
.ToList();
如果您在
事件发生后设置断点,并查看其内容,您将看到在3月12日,UTC时间从16:00变为15:00,而本地时间保持稳定。3月12日,美国/纽约从UTC-5转为UTC-4,当时时钟发生变化:


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

我还将此添加到ical.net wiki中: