【问题标题】:Recurring events with daylight savings time support using ical.net使用 ical.net 支持夏令时的重复事件
【发布时间】:2018-02-28 13:03:59
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net icalendar ical-dotnet


    【解决方案1】:

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

    为此,解决方案是使用本地时区来表达您的CalDateTimes。完成此操作后,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 进行时区转换。)

    【讨论】:

    猜你喜欢
    • 2012-02-12
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2011-11-20
    • 2011-08-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多