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

Oli*_*ver 50 cocoa-touch objective-c nstimezone ios

我看到NSTimeZone有这些方法:

defaultTimeZone  
localTimeZone  
systemTimeZone
Run Code Online (Sandbox Code Playgroud)

有人可以用简单的方式向我解释,这些调用之间的差异是什么,何时应该使用而不是另一个?我不明白Apple文档中有关于此的任何内容.

Jos*_*ell 73

文档中的语言有点干,当然,名称的相似性可能令人困惑.我会在这里引用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
Run Code Online (Sandbox Code Playgroud)

类似的事情发生在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!
Run Code Online (Sandbox Code Playgroud)

Apple似乎建议使用 localTimeZone:

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


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