我正在将字符串“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]];
我选择的任何时候都会得到相同的结果。有任何想法吗?顺便提一下,这是在模拟器上,是的,我的区域格式设置为美国。
答案 0 :(得分:2)
当您NSLog NSDate时,它会将时间打印为GMT时区
为了查看正确的数据,您必须使用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中 更新为了将数据保存到文件或数据库,我建议您像这样保存
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
将字符串中的时间解释为您当地的时间。)