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

2024-03-08

我看到NSTimeZone有这些方法:

defaultTimeZone  
localTimeZone  
systemTimeZone

有人可以简单地向我解释一下这些调用之间有什么区别,以及何时应该使用其中一个而不是另一个?我不明白苹果文档中关于此的任何内容。


可以肯定的是,文档中的语言有点枯燥,而且名称的相似性可能会令人困惑。我将引用NSTimeZone docs http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSTimeZone_Class/在这里并尝试解释它们:

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!

苹果似乎推荐使用 http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtTimeZones.html#//apple_ref/doc/uid/20000185-SW2 localTimeZone:

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


*Note that localTimeZone is still subject to the app-level cache of the system time zone. It only changes to follow your setting of the default time zone.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone - 时区便利方法之间的差异 的相关文章

随机推荐