iPhone – 时区便利方法之间的差异

我看到NSTimeZone有这些方法:

 defaultTimeZone localTimeZone systemTimeZone 

有人可以用简单的语言向我解释这些呼召之间的区别是什么,应该用什么来区别对方? 我不明白苹果文档里面有关于此的任何内容。

当然,文档中的语言有些偏于干涉,并且名称的相似性可能会令人困惑。 我会在这里引用NSTimeZone文档并尝试解释它们:

systemTimeZone
系统当前使用的时区。 如果当前时区无法确定,则返回GMT时区。

这是设备认为它在的时区; 它通常会自动设置,然后会对应于设备的物理位置,但是如果用户已经在设置应用程序中明确设置了特定的时区,那么您将会得到。

defaultTimeZone
当前应用程序的默认时区。 如果没有设置默认时区,则此方法调用systemTimeZone并返回系统时区。

您的应用程序被允许设置自己的时区,以便您可以执行操作,就好像设备在另一个区域中一样,但不会影响系统时区(以及其他应用程序)。 该设置是通过调用setDefaultTimeZone:来执行的。 如果你还没有这样做,这个调用和调用systemTimeZone是一样的。

localTimeZone
将所有消息转发到当前应用程序的默认时区的对象。 本地时区始终表示默认时区的当前状态。

这是有点棘手。 localTimeZone给你几乎与defaultTimeZone相同的结果。 区别在于,您从localTimeZone获得的特定NSTimeZone实例将始终反映您对应用中的时区所做的设置。 您可以调用一次,保存结果,并始终通过该对象获取当前的模拟时区,而不pipe所做的更改。 就好像,当你使用这个NSTimeZone实例时,框架为你调用了defaultTimeZone ,以确保你总是得到当前的值。

以上是几个简单的插图。 从systemTimeZone返回的NSTimeZone对象代表您拨打电话时的系统时区。 如果再次调用systemTimeZone ,即使用户已经更改了时区,也会得到相同的时区。 您的应用程序caching该值,并且您必须要求系统使用resetSystemTimeZone清除它以获取更新。

 // Say that device is in GMT originally NSLog(@"%@", [NSTimeZone systemTimeZone]); // GMT // User flies into Rome and iPhone changes the zone automatically NSLog(@"%@", [NSTimeZone systemTimeZone]); // Still GMT [NSTimeZone resetSystemTimeZone]; // Clear app's cache NSLog(@"%@", [NSTimeZone systemTimeZone]); // Now GMT+2 

类似的事情发生在defaultTimeZone 。 当您调用该方法时,即使稍后调用setDefaultTimeZone:也会获得始终表示相同时区的对象。 但是,如果您使用从localTimeZone获得的对象,它将跟随您对默认时区*进行的更改。

 // Say that defaultTimeZone is originally GMT NSTimeZone * myDefaultTZ = [NSTimeZone defaultTimeZone]; NSTimeZone * myLocalTZ = [NSTimeZone localTimeZone]; [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Etc/GMT-4"]]; NSLog(@"%@", myDefaultTZ); // Still gives GMT NSLog(@"%@", [NSTimeZone defaultTimeZone]); // GMT-4, the new value NSLog(@"%@", myLocalTZ); // Also the new value! 

苹果似乎推荐使用 localTimeZone

使用localTimeZone类方法,您可以获得一个相对时区对象,该对象将自身解码为其自身所在的任何计算机上的默认时区。


*请注意, localTimeZone仍然受制于系统时区的应用程序级caching。 它只会更改为遵循默认时区的设置。