在Objective-C中将时间转换为本地时间

时间:2016-06-30 17:10:38

标签: objective-c nsdate nsdateformatter

我遇到了这个问题,其中通过了正确的时间,但一旦它到达[formatter setDateFormat:date],它就会在不同的时区出现。这是一个片段

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

2 个答案:

答案 0 :(得分:1)

这是发生了什么:日期的日志将始终是GMT。 (我认为有一个很好的解释here让我了解细节是不合理的。)这意味着日志1,2和3将是“错误的”(不在您的时区)并且应该是预期的。

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

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

答案 1 :(得分:1)

您的时区显然是UTC-7000。

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

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

format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

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