为什么即使我在NSDateFormatter上设置时区,stringFromDate NSString仍然有GMT时间?

时间:2014-05-07 21:48:42

标签: ios objective-c

实际NSDate对象的输出( firstTime )是我想要的(iOS设备的时间)。 NSString对象( secondTime )似乎仍然显示GMT时间(比当地时间早4个小时,EST),即使我设置了日期格式化程序( df )到localTimeZone。为什么不起作用?

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];

NSDate *firstTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
NSLog(@"%@", firstTime);
NSString *secondTime = [df stringFromDate:firstTime];
NSLog(@"%@", secondTime);

输出:

第一时间:2014-05-07 17:41:29 +0000,第二时间:13:41:29

2 个答案:

答案 0 :(得分:2)

NSDate没有时区。读了五遍直到你理解它为止。

此:

[NSDate date]

返回现在的日期。它没有时区。它不在GMT或任何其他时区。它没有。你的代码:

[NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];

表示GMT之外的任何用户现在都没有的时间。我会重复一遍:你的NSDate现在没有描述。这就像坐在旧金山一样,看着你的手表是在正确的当地时间设置的,然后在12:00说然后告诉所有人“这意味着它是凌晨4点,因为我们比GMT落后8小时”。

结果:

[df stringFromDate:firstTime]

将构建一个字符串,显示现在不是的时间。

不要再认为自己比那些曾经在Apple工作过的人更聪明,并试着这样做:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];

NSString *secondTime = [df stringFromDate:[NSDate date]];
NSLog(@"%@", secondTime);

所以说“在当地时区给我一串'现在'”。告诉我:它输出正确的东西吗?

答案 1 :(得分:2)

应该让NSDate捕获实际日期/时间,而不尝试执行任何时区调整,然后让NSDateFormatter格式化字符串,以便在期望的时区中表示。

所以,看看你的代码:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"HH:mm:ss"];
[df setTimeZone:[NSTimeZone localTimeZone]];

虽然没有必要设置当地时区的时区,但没关系。日期格式化程序默认为当前时区。

然后你继续尝试抓住当前时间并调整它:

NSDate *firstTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]];
NSLog(@"%@", firstTime);

虽然我理解你为什么试图这样做,但这是不正确的。不应对时区进行调整。因此,firstTime的分配应该是:

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

因此,如果您在下午5:41(东部)执行此操作,此NSLog现在将报告2014-05-07 21:41:29 +0000,但这是正确的(因为+0000表示它正在向您显示时间在UTC / GMT / Zulu)。

然后,如果您想在本地时区显示该内容,则可以使用未经调整的[NSDate date]并将其与格式化程序一起使用,就像您在问题中所做的那样:

NSString *secondTime = [df stringFromDate:firstTime];
NSLog(@"%@", secondTime);

然后会报告17:41:29,就像您预期的那样。