我有在生产应用程序,其计算从所述用户输入日期GMT日期以下代码:

NSDate *localDate = pickedDate;
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

中的代码工作正常,直到可怕的夏令时在英国上周生效。

如何转换日起GMT,同时考虑到夏令?

有帮助吗?

解决方案

的NSDate使用来自绝对值一个偏移量来表示的时间间隔。依据是在格林尼治标准时间,所有的时间间隔都在格林尼治标准时间,这就是为什么你看到的差别。如果你希望你的约会对象的字符串表示(如在数据库或任何存储),使用NSDateFormatter在您需要哪个特定的时区来创建它。

所以,这将永远给你一个字符串表示(如用于存放在MySQL)在GMT日期(以节省一大跳次占):

NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // e.g., set for mysql date strings
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSString* mysqlGMTString = [formatter stringFromDate:[NSDate date]];

这会给你时间GMT正确的日期字符串不管本地时区。另外,请记住,所有的相对测量您使用的NSDate和时间间隔也有自己的GMT基础。使用日期格式化和日历对象,将它们转换为更有意义的事情,当你将其呈现给用户,或者如果你需要做的日历计算(例如,显示警告,您的订阅将于明天到期)。

编辑:我忘了添加的时区!没有它格式化器将使用该系统的时区。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top