iPhone - 时区便利方法之间的差异
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iPhone - 时区便利方法之间的差异相关的知识,希望对你有一定的参考价值。
我看到NSTimeZone
有这些方法:
defaultTimeZone
localTimeZone
systemTimeZone
有人可以用简单的方式向我解释,这些调用之间的差异是什么,何时应该使用而不是另一个?我不明白Apple文档中有关于此的任何内容。
文档中的语言有点干,当然,名称的相似性可能令人困惑。我会在这里引用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!
苹果似乎recommend using localTimeZone
:
使用localTimeZone类方法,您可以获得一个相对时区对象,该对象将自身解码为在其找到自身的任何计算机上的默认时区。
*请注意,localTimeZone
仍受制于系统时区的应用级缓存。它只会更改为遵循您设置的默认时区。
以上是关于iPhone - 时区便利方法之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
由于 IP 和 SP 之间的时区差异导致的 Spring Saml 安全身份验证问题