NSDate - iPhone上的GMT

Mic*_*ker 3 iphone nsdate gmt dst

我在生产应用程序中有以下代码,它根据用户输入的日期计算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];
Run Code Online (Sandbox Code Playgroud)

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

如何在考虑夏令时的同时将日期转换为GMT?

Jas*_*oco 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]];
Run Code Online (Sandbox Code Playgroud)

无论当地时区如何,这都将为您提供GMT时间内正确的日期字符串.另外,请记住,您使用NSDate和时间间隔进行的所有相对测量都以GMT为基础.当您将日期格式化程序和日历对象呈现给用户或者您需要进行日历计算时(例如,显示明天即将到期的警告),请使用日期格式化程序和日历对象将它们转换为更有意义的事物.

编辑:我忘了添加时区!没有它,格式化程序将使用系统时区.