2016-06-30 83 views
1

我在正确的时间通过但遇到[formatter setDateFormat:date]后出现在不同时区的问题。这里是一个片段将时间转换为Objective-C的当地时间

NSDate* date = user.startDate; 
NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
NSLog(@"-------> (1) time is %@", date); 
NSLog(@"-------> (2) time is %@", date); 
[format setDateFormat:@"h:mm a"]; 
NSLog(@"-------> (3) time is %@", date); 
NSLog(@"-------> (4) time is %@", [format stringFromDate:date]); 

这里是调试器输出的日志消息

-------> (1) time is 2016-06-30 09:25:17 +0000 
-------> (2) time is 2016-06-30 09:25:17 +0000 
-------> (3) time is 2016-06-30 09:25:17 +0000 
-------> (4) time is 2:25 AM 

我期待的输出为(4)time is 9:25 AM

+0

我删除了与您的问题无关的代码(但保留了重复行,以便答案中的引用保持有效)。 – Eiko

+0

请注意,(1),(2),(3)只是做了确切的事情。日期是不可变的,并且是同一个实例,并且您没有使用格式化程序。 – Eiko

回答

1

您的时区显然是UTC-7000。

NSLog打印NSDate对象始终以UTC表示,NSDateFormatter考虑当前时区。打印的日期实际上是相同的。

如果您确实需要UTC中的所有日期,请设置格式器的时区。

format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

顺便说一句:有内置的方法来检查日期是在今天还是昨天。

1

这里的是怎么回事:日志的日期将始终是格林尼治标准时间。 (我认为这对我来说没有任何意义,因为有一个很好的解释here。)这意味着日志1,日志2和日志3将是“错误的”(不在你的时区),这应该是预期的。

例如,如果您要将字符串记录为GMT,则可以更改日期格式化程序的属性timeZone

处理日期可能非常困难。如果不是全部,请花些时间阅读this文档(基础知识/基础知识)的一些重要部分。