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

时间:2011-05-12 22:58:43

标签: objective-c cocoa-touch ios nstimezone

我看到NSTimeZone有这些方法:

defaultTimeZone  
localTimeZone  
systemTimeZone

有人可以用简单的方式向我解释一下这些电话之间的差异,以及何时应该使用另一个电话?我不明白Apple文档中有关于此的任何内容。

1 个答案:

答案 0 :(得分:73)

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

  

<强> 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!

Apple似乎recommend using localTimeZone

  

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


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

相关问题