将时间转换为当地时间 Objective-C

Convert time to local time in Objective-C

我遇到了这个问题,它传递了正确的时间,但是一旦到达 [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

事情是这样的:日期日志将始终为格林威治标准时间。 (我认为深入细节对我来说没有意义,因为有一个很好的解释 here。)这意味着日志 1、2 和 3 将是“错误的”(不在您的时区)并且应该是可以预料的。

例如,如果您想将字符串记录为 GMT,您可以更改日期格式器的 属性 timeZone

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

您的时区显然是 UTC-7000。

NSLog 始终以 UTC 打印 NSDate 个对象,NSDateFormatter 考虑当前时区。打印出来的日期其实是一样的

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

format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

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