3

我在生产应用程序中有以下代码,它从用户输入的日期计算 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?

4

1 回答 1

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 为基础。当您将日期格式化程序和日历对象呈现给用户或需要进行日历计算(例如,显示您的订阅明天到期的警告)时,使用日期格式化程序和日历对象将它们转换为更有意义的东西。

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

于 2010-04-06T00:08:56.220 回答