Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中将时间转换为本地时间_Objective C_Nsdate_Nsdateformatter - Fatal编程技术网

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

在Objective-C中将时间转换为本地时间,objective-c,nsdate,nsdateformatter,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

我遇到过这样一个问题:正确的时间过去了,但一旦它到达
[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)
的输出是
时间是上午9:25

发生了这样的事情:日期的日志总是GMT(我认为我没有必要深入了解细节,因为有很好的解释。)这意味着日志1、2和3将是“错误的”(不在您的时区)这是意料之中的

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


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

您的时区显然是UTC-7000

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

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

format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

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

我删除了与您的问题无关的代码(但保留了重复的行,以便答案中的引用仍然有效)。请注意,(1)、(2)、(3)只是在做完全相同的事情。日期是不可变的,并且是同一个实例,并且您没有使用格式化程序。