2011-04-08 76 views
0
NSDate *dateNow = [NSDate date]; 
NSLog(@"NSDate    : %@", dateNow); 

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
[dateFormatter setTimeStyle:NSDateFormatterLongStyle]; 

NSString *dateString = [dateFormatter stringFromDate:dateNow]; 
NSLog(@"NSDateFormatter String: %@", dateString); 

NSDate *dateObject = [dateFormatter dateFromString:dateString]; 
NSLog(@"NSDateFormatter Object: %@", dateObject); 

首先忽略1970-01-01我只对现在的时间感兴趣。NSDateFormatter NSString?

我的问题是,当我从NSDate获得时间时,它不包含任何时区信息。这是我所期望的,所以从NSDate返回的时间是01:21:57 PM。为了纠正这种情况,我使用NSDateFormatter并设置它的语言环境,它正确地解释了我在伦敦,英国夏令时(GMT + 01)。最后,我想将新的更正日期作为NSDate取回,以便在以前正确的dateString上使用dateFromString。

任何人都可以告诉我为什么结果日期恢复为未修正状态(即01:21:57 PM)是否有我可以做这种转换并仍然保持指定的区域/时区?

>> WALL_CLOCK: 02:21:57 PM 
>> NSDate    : 2011-04-08 01:21:57 PM +0000 
>> NSDateFormatter String: 02:21:57 PM GMT+01:00 
>> NSDateFormatter Object: 1970-01-01 01:21:57 PM +0000 

回答

2

所有的NSDate对象存储为由于基准日期秒(2001年1月1日○点00 GMT)等总是GMT + 0。

+0

,所以如果我需要回到一个NSDate为无论什么原因,我将需要使用另一个NSDateFormatter来调整区域设置以输出正确的时间? – fuzzygoat 2011-04-08 13:54:00

+0

基本上每次你需要显示视图的日期和时间时,你都需要NSDateFormatter。如果你有很多转换,你可以在你的控制器init中创建一个NSDateFormatter的ivar。不要忘记在你的dealloc中发布。 :) – 2011-04-08 13:59:53

+0

是的,我明白它是如何工作的。那么,如果你使用iOS的当前NSDate比较已知的NSDate日期/时间,那么会发生什么呢?你只是在GMT + 0指定了已知的日期做了计算(即从那以后有多少小时),然后我们NSDateFormatter转换为当前语言环境。那有意义吗? – fuzzygoat 2011-04-08 15:54:24

0

在你的代码中。您只提供了区域设置和时间的格式。您没有提供日期的格式,所以你得到了默认的结果:1970-01-01

NSDate *dateNow = [NSDate date]; 
NSLog(@"NSDate    : %@", dateNow); 

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
[dateFormatter setTimeStyle:NSDateFormatterLongStyle]; 
[dateFormatter setDateStyle:NSDateFormatterLongStyle]; 

NSString *dateString = [dateFormatter stringFromDate:dateNow]; 
NSLog(@"NSDateFormatter String: %@", dateString); 

NSDate *dateObject = [dateFormatter dateFromString:dateString]; 
NSLog(@"NSDateFormatter Object: %@", dateObject); 

输出:

2011-04-08 10:12:39.119 test[2957:207] NSDate    : 2011-04-08 14:12:39 +0000 
2011-04-08 10:12:39.121 test[2957:207] NSDateFormatter String: April 8, 2011 10:12:39 AM EDT 
2011-04-08 10:12:39.123 test[2957:207] NSDateFormatter Object: 2011-04-08 14:12:39 +0000 
+0

嗨乔丹,这是真的,我在文中提到过。然而,这是我选择不做的事情,我的问题是,当我做了dateFromString(在本地化的GMT + 01)字符串时,它回到未本地化(即GMT)。 – fuzzygoat 2011-04-08 15:49:20

+0

好点。看起来像一个错误。 – Jordan 2011-04-08 17:07:50