通过ICS文件中的重复事件,iOS / iCal切换时间超过夏令时

时间:2012-07-25 21:42:32

标签: ios icalendar dst

我有一个使用UTC设置的事件,它会在夏令时之间重复出现。夏令时切换后,时间移动一小时。 UTC不使用DST,因此时间应该保持不变。我可以在DST之后使用完全相同的UTC时间值添加事件,日历显示正确的时间。我已经在下面发布了我的ICS文件,其中包含重复发生的事件以及之后发生的事件。有没有人碰到这个?任何建议的修复或更改?

[“BEGIN:VCALENDAR \ nVERSION:2.0 \ nPRODID: - // sethhill v1.0 // NONSGML // EN \ nCALSCALE:GREGORIAN \ nMETHOD:PUBLISH \ nBEGIN:VEVENT \ nDSTSTAMP:20120725T222602Z \ nDTSTART:20120724T180000Z \ nDTEND :20120724T183000Z \ nRRULE:FREQ = WEEKLY; UNTIL = 20130707T180000Z \ nSUMMARY:Class 4 - NODST \ nBEGIN:VALARM \ nTRIGGER:-PT45M \ nACTION:DISPLAY \ nDESCRIPTION:NODST \ nEND:VALARM \ nEND:VEVENT \ nBEGIN:VEVENT \ nDTSTAMP :20120725T222602Z \ nDTSTART:20121120T190000Z \ nDTTEND:20121120T193000Z \ nRRULE:FREQ = WEEKLY; UNTIL = 20130707T180000Z \ nSUMMARY:Class 4 - TEST1DST \ nBEGIN:VALARM \ nTRIGGER:-PT45M \ nACTION:DISPLAY \ nDESCRIPTION:TEST1DST \ nEND:VALARM \ nEND :VEVENT \ NEND:VCALENDAR“]

2 个答案:

答案 0 :(得分:0)

我对DST和UTC如何工作有误。我认为设置UTC时间意味着日历会将其作为设定时间读取并自动显示正确的本地时间。如果其他人有点困惑,可以这样想:MST是UTC-07:00 MDT(DST)是UTC-06:00。如果您的日历事件设置为全年重复且为18:00 UTC,则将在MDT中午12:00或MST上午11:00。对于ICS文件,您可以定义STANDARD时区和DAYLIGHT时区,也可以将事件分成多个部分,每个部分都有正确的UTC时间。

我希望这能为其他人解决问题。

答案 1 :(得分:0)

public static DateTime GetDSTStart(int year, TimeZoneInfo timeZone)
        {
            DateTime finder = new DateTime(year,3,8);
            finder = finder.AddHours(6);
            for (int i = 0; i < 7; i++)
            {
                if(timeZone.IsDaylightSavingTime(finder.AddDays(i))){
                    return (finder.AddDays(i).AddHours(-6));
                }
            }
            finder = DateTime.MinValue;
            return finder;
        }

public static DateTime GetDSTEnd(int year, TimeZoneInfo timeZone)
        {
            DateTime finder = new DateTime(year, 11, 1);
            finder = finder.AddHours(6);
            for (int i = 0; i < 7; i++)
            {
                if (!timeZone.IsDaylightSavingTime(finder.AddDays(i)))
                {
                    return (finder.AddDays(i).AddHours(-6));
                }
            }
            finder = DateTime.MinValue;
            return finder;
        }