我在生产应用程序中有以下代码,用于计算用户输入日期的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?
答案 0 :(得分:6)
NSDate使用绝对值的偏移量来表示时间间隔。基础是GMT,所有时间间隔都是GMT,这就是你看到差异的原因。如果你想要一个日期的字符串表示(比如存储在数据库或其他任何东西),使用NSDateFormatter在你需要的任何特定时区创建它。
因此,这将始终为您提供GMT中日期的字符串表示(如存储在mysql中)(占用夏令时):
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为基础。当您将日期格式器和日历对象呈现给用户时,或者如果您需要进行日历计算(例如,显示明天即将到期的警告)时,请使用日期格式器和日历对象将它们转换为更有意义的事物。
编辑:我忘了添加时区!没有它,格式化程序将使用系统时区。