NSDateFormatter给我4小时的时间

时间:2012-06-11 04:26:34

标签: ios nsdate

我正在将字符串“Jun 11,2012 9:30 PM”转换为NSDate,由于某种原因我提前4小时。有趣的是,我正在使用相同的字符串在详细视图中提供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]];

我选择的任何时候都会得到相同的结果。有任何想法吗?顺便提一下,这是在模拟器上,是的,我的区域格式设置为美国。

2 个答案:

答案 0 :(得分:2)

当您NSLog NSDate时,它会将时间打印为GMT时区 为了查看正确的数据,您必须使用stringFromDate

将NSDate转换为字符串
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中 更新为了将数据保存到文件或数据库,我建议您像这样保存

NSTimeInterval timeInterval  = [dateFromString timeIntervalSince1970];

现在,当您从数据库中再次阅读

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

答案 1 :(得分:1)

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

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将字符串中的时间解释为您当地的时间。)