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

iOS/iCal通过ICS文件中的重复事件切换夏时制时间,ios,icalendar,dst,Ios,Icalendar,Dst,我有一个使用UTC设置的事件,它会在夏令时重复发生。在夏令时开关后,时间移动一小时。UTC不使用DST,因此时间应保持不变。我可以在DST之后添加具有完全相同UTC时间值的事件,并且日历显示正确的时间。我已经在下面发布了我的ICS文件,其中包括重复发生的事件和之后发生的事件。有人碰到过这个吗?有任何建议的修复或更改吗 ["开始:VCALENDAR\n版本:2.0\n修改:-//sethhill v1.0//NONSGML//EN\nCALSCALE:GREGORIAN\n方法:发布:VEVENT

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


["开始:VCALENDAR\n版本:2.0\n修改:-//sethhill v1.0//NONSGML//EN\nCALSCALE:GREGORIAN\n方法:发布:VEVENT\nDTSTAMP:20120725T222602Z\nDTSTART:20120724T180000Z\n趋势:20120724T180000Z\n规则:频率=每周;截止日期:20130707T180000Nz\n命令:类别4-NODST\nBEGIN:VALARM\nTRIGGER:-PT45M\n操作:显示\ndescript:NODST\nEND:Vearm\nT\n开始:20121120T190000Z\n结束:20121120T193000Z\n规则:频率=每周;结束=20130707T180000Z\n命令:类别4-测试1DST\n开始:VALARM\nTRIGGER:-PT45M\n操作:显示\n说明:TEST1DST\nEND:VALARM\nEND:VEVENT\nEND:VCALENDAR“]

我对DST和UTC的工作方式有错误的看法。我认为设置UTC时间意味着日历将读取它作为一个设置的时间,并自动神奇地显示正确的本地时间。如果其他人有点困惑,可以这样想:MST是UTC-07:00 MDT(DST)是UTC-06:00。如果您的日历事件设置为全年重复,并且是UTC 18:00,则它将在MDT下午12:00或MST上午11:00。对于ICS文件,您可以定义标准时区和夏令时,或者将事件分为多个部分,每个部分都有正确的UTC时间

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

public static DateTime GetDSTStart(int year,TimeZoneInfo timeZone)
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;
        }
{ DateTime finder=新的日期时间(年,3,8); finder=finder.AddHours(6); 对于(int i=0;i<7;i++) { if(时区IsDaylightSavingTime(查找器添加天数(i))){ 返回(查找器添加天数(i).AddHours(-6)); } } finder=DateTime.MinValue; 返回查找器; } 公共静态日期时间GetDSTEnd(整数年,时区信息时区) { DateTime finder=新的日期时间(年份,11,1); finder=finder.AddHours(6); 对于(int i=0;i<7;i++) { 如果(!timeZone.IsDaylightSavingTime(finder.AddDays(i))) { 返回(查找器添加天数(i).AddHours(-6)); } } finder=DateTime.MinValue; 返回查找器; }
一个具体的例子来说明你如何修复它会非常有帮助。我最终将事件分为两部分。一部分在DST之前有一个相关的UTC时间,另一部分在DST之后有一个正确的UTC时间。一个ICS文件可以帮到你吗?你能发布你所做的例子吗?我对DST也有同样的问题,不是吗I don’我不知道你是如何将一个定期约会一分为二的,一个是在DST之前,另一个是在DST之后……即使你这样做了,你是如何获得时间变化的信息以了解新时间的第一个日期的?我的意思是,你是否在你的应用程序中存储所有时区的信息?你是否连接到任何web服务?非常感谢advance@PalomaCallejo,我写道一个获取给定年份和时区的夏令时开始日期和结束日期的函数。我将在下面的答案中附加它。我正在创建ICS文件服务器端,以便应用程序通过web服务使用。由于我是自己编写ICS文件的,所以我只需在ICS文件中创建事件,以便在DST之前停止,然后创建一个新的ev在DST发生后+/-1小时内开始ent。