NSDateFormatter总是将日期减少一个小时

时间:2013-05-31 13:14:09

标签: ios objective-c nsdate nsdateformatter

我有以下代码

NSString *dateString = @"2013-05-24T10:30:00+0200";
        NSLog(@"date string before format %@", dateString);
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
        NSDate *date = [dateFormatter dateFromString:dateString];
        dateString = [dateFormatter stringFromDate:date];
        NSLog(@"date string after format %@", dateString);

输出是:

date string before format 2013-05-24T10:30:00+0200
date string after format 2013-05-24T09:30:00+0100

为什么10:30然后9:30显示?!!!

3 个答案:

答案 0 :(得分:2)

时区会造成麻烦

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT+0:00"]];

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

答案 1 :(得分:2)

结果还可以。这两个日期都是相同的,在将字符串解析为NSDate之后,NSLog会打印出您当地区域的输出。

请参阅:您在解析日期中有10:30 + 2h字符串和9:30 + 1h时区偏移量。这意味着两个日期都是8:30 GMT

编辑以澄清:

NSDate是独立于时区的日期表示。因此,解析后的NSDate实例的内部表示正确地描述了输入字符串中的日期,您可以安全地使用日期进行计算等。它只取决于NSDateFormatter创建最终字符串的方式。默认情况下,它会在您的本地时区创建字符串。这就是为什么你的输出与输入不完全相同的字符串。但是如果你计算小时+时区偏移量,那是正确的。

如果您确实需要具有相同的输出字符串,则必须将NSDateFormatter的时区或NSLocale显式设置为与输入日期字符串相同的时区(某些区域设置/时区带有时区)来自GMT)的偏移量+2

答案 2 :(得分:0)

时间是一样的,它只是一个不同的时区,只需设置你的日期时区:

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];