我看到NSTimeZone
有这些方法:
defaultTimeZone
localTimeZone
systemTimeZone
有人可以简单地向我解释一下,这些调用之间有什么区别,什么时候应该使用一个而不是另一个?我不了解 Apple 文档中关于此的任何内容。
我看到NSTimeZone
有这些方法:
defaultTimeZone
localTimeZone
systemTimeZone
有人可以简单地向我解释一下,这些调用之间有什么区别,什么时候应该使用一个而不是另一个?我不了解 Apple 文档中关于此的任何内容。
可以肯定的是,文档中的语言有点枯燥,而且名称的相似性可能会造成混淆。我将在这里引用NSTimeZone
文档并尝试解释它们:
systemTimeZone
系统当前使用的时区。如果无法确定当前时区,则返回 GMT 时区。
这是设备认为它所在的时区;它通常是自动设置的,然后会对应于设备的物理位置,但如果用户在设置应用程序中明确设置了特定的时区,这就是你会得到的。
defaultTimeZone
当前应用程序的默认时区。如果没有设置默认时区,该方法调用systemTimeZone
并返回系统时区。
您的应用程序可以设置自己的时区,以便您可以像设备在另一个时区一样执行操作,但不会影响系统时区(以及其他应用程序)。通过调用 来执行设置setDefaultTimeZone:
。如果您还没有这样做,则此调用与调用相同systemTimeZone
。
localTimeZone
将所有消息转发到当前应用程序的默认时区的对象。本地时区始终代表默认时区的当前状态。
这是它变得有点棘手的地方。localTimeZone
给你几乎相同的结果defaultTimeZone
。NSTimeZone
不同之处在于,您从中获取的特定实例localTimeZone
将始终反映您对应用程序中的时区所做的设置。您可以调用它一次,保存结果,并始终通过该对象获取当前模拟时区,无论所做的更改如何。就好像,当您使用此NSTimeZone
实例时,框架正在召唤defaultTimeZone
您,以确保您始终获得当前值。
这是上面的几个简要说明。您返回的NSTimeZone
对象systemTimeZone
代表您拨打电话时的系统时区。如果您systemTimeZone
再次调用,即使用户已经更改了时区,您也会得到相同的时区。您的应用程序会缓存该值,您必须要求系统清除它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
仍以系统时区的应用级缓存为准。它只会根据您对默认时区的设置进行更改。