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。 它只会更改为遵循默认时区的设置。