实际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
答案 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
,就像您预期的那样。