NSDateFormatter的输出不正确

时间:2012-09-16 02:42:06

标签: ios nsdateformatter

我从NSDateFormatter获得了一些奇怪的输出。我正在将GMT的日期转换为系统时区,即EDT。这应该是格林威治标准时间-4小时。

- (NSDate *)parseDate:(NSString *)inStrDate {

NSLog(@"Date To Parse %@", inStrDate);
NSDateFormatter* dtFormatter = [[NSDateFormatter alloc] init];
[dtFormatter setLocale:[NSLocale systemLocale]];
[dtFormatter setTimeZone:[NSTimeZone systemTimeZone]];
[dtFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss +0000"];
NSDate* dateOutput = [dtFormatter dateFromString:inStrDate];
NSLog(@"Parsed Date %@ %@", dateOutput, [NSTimeZone systemTimeZone]);

return dateOutput;

}

日志输出:

  

2012-09-15 22:32:53.358约会日期2012-09-16 02:32:53 +0000   2012-09-15 22:32:53.360解析日期2012-09-16 06:32:53 +0000 America / New_York(EDT)偏移-14400(日光)

但它返回+4小时而不是-4小时。因此它应该在美国东部时间22.30(格林尼治标准时间02:30)输出,它实际上是美国东部夏令时间06.30返回。这是将来的8个小时。

任何人都可以帮我理解我在这里出错了吗?我正在挠头,但我无法弄清楚为什么这似乎不起作用。

由于

2 个答案:

答案 0 :(得分:2)

你刚才错误地使用了dateFormatter。 当你这样做

[dtFormatter setTimeZone:[NSTimeZone systemTimeZone]];

您告诉它输入日期是您的时区。因此,它将其转换为GMT并输出时间+4小时。要做到这一点,你可以使用它:

NSDateFormatter* df_local = [[NSDateFormatter alloc] init];
[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[df_local setDateFormat:@"yyyy.MM.dd' 'HH:mm:ss zzz"];

NSDate* dateOutput = [dtFormatter dateFromString:dateString];
NSLog(@"Parsed Date in GMT %@", dateOutput);
NSString *yourLocalDate = [df_local stringFromDate:dateOutput];
NSLog(@"in EDT %@",yourLocalDate);

记录

2012-09-16 05:23:53.297 TestingApplication[10109:c07] Date To Parse 2012-09-16 02:32:53 +0000
2012-09-16 05:23:53.302 TestingApplication[10109:c07] Parsed Date in GMT 2012-09-16 02:32:53 +0000
2012-09-16 05:23:53.304 TestingApplication[10109:c07] in EDT 2012.09.15 22:32:53 EDT

答案 1 :(得分:1)

如果您希望将日期作为最终输出,则可以跳过辅助NSDateFormatter,只需“添加”UTC日期和本地时间之间的差异。

formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];        
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSDate *date = [formatter dateFromString:dateString]; // UTC date
NSDate *date2 = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMTForDate:date]]; // local date!