NSDateFormatter提前4小时给我时间

我将一个string“2012年6月11日9:30 PM”转换为NSDate,由于某种原因,我一直在提前4个小时。 有趣的是我使用相同的string来提供一个UIDatePicker的详细视图中,我必须做相同的转换,并且UIDatePicker渲染时间罚款。 只有当我现在尝试NSLog它在我的主要和详细的看法,我有问题。

这是在我看来:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"MMMM dd, yyyy h:mma"]; NSDate *dateFromString = [[[NSDate alloc] init]autorelease]; NSLog(@"DATE %@", _date); dateFromString = [formatter dateFromString:_date]; NSLog(@"NSDATEFROMSTRING %@", dateFromString); 

NSLog返回:

 2012-06-11 00:02:09.136 LocalDeals[78090:207] DATE Jun 11, 2012 9:30 PM 2012-06-11 00:02:09.137 LocalDeals[78090:207] NSDATEFROMSTRING 2012-06-12 01:30:00 +0000 

即使当我添加:

 [formatter setTimeZone:[NSTimeZone defaultTimeZone]]; 

从任何时候我都可以得到同样的结果。 有任何想法吗? 这是模拟器的方式,是的我的地区格式设置为美国。

当你NSLog的一个NSDate它将打印时间GMT时区为了看到正确的数据,你将不得不将NSDate转换为string使用stringFromDate

 NSDate *dateFromString = [[[NSDate alloc] init]autorelease]; NSLog(@"DATE %@", _date); //Instead of nslog directly, use this stringFromDate:remindOn NSString *str = [formatter stringFromDate:dateFromString]; NSLog(@"date is %@", str); //This will log the correct data 

你得到的问题是不是在NSDate,但它是在日志logging更新为了将数据保存到文件或数据库我build议你像这样保存

 NSTimeInterval timeInterval = [dateFromString timeIntervalSince1970]; 

现在,当你从数据库中再次读取你会做的

 NSDate *data = [[NSDate alloc] initWithTimeIntervalSince1970:timeInterval] 

以下代码将显示您的时间与您的时区:

 NSString *_date = @"Jun 11, 2012 9:30 PM"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"MMMM dd, yyyy h:mma"]; [formatter2 setDateFormat:@"MMMM dd, yyyy h:mma Z"]; NSDate *dateFromString = [[NSDate alloc] init]; NSLog(@"DATE %@", _date); dateFromString = [formatter dateFromString:_date]; NSLog(@"NSDATEFROMSTRING %@", dateFromString); NSLog(@"NSDATEFROMSTRING %@", [formatter stringFromDate:dateFromString]); NSLog(@"NSDATEFROMSTRING %@", [formatter2 stringFromDate:dateFromString]); 

结果:

 DATE Jun 11, 2012 9:30 PM NSDATEFROMSTRING 2012-06-12 04:30:00 +0000 NSDATEFROMSTRING June 11, 2012 9:30PM NSDATEFROMSTRING June 11, 2012 9:30PM -0700 

如果您现在使用Google的UTC时间,它会给您一个接近输出中第二行的时间,这确认它正在将时间打印为UTC时间。

(我们处于不同的时区, dateFromString将当前时间解释为string中的时间。)