我看到NSTimeZone有以下几种方法:

defaultTimeZone  
localTimeZone  
systemTimeZone

有人能简单地向我解释一下,这些电话之间的区别是什么,以及何时应该使用其中一个而不是另一个?我不理解苹果文档中关于这件事的任何内容.

推荐答案

诚然,文档中的语言有点枯燥,名称的相似性可能会让人困惑.我将在这里引用这NSTimeZone docs条,并试图解释它们:

100

这是设备认为自己所在的时区;它通常是自动设置的,然后会与设备的物理位置相对应,但如果用户在设置应用程序中明确设置了特定的时区,你就会得到这样的结果.

100

您的应用程序可以设置自己的时区,这样您就可以像设备在另一个时区一样执行操作,但不会影响系统时区(以及其他应用程序).通过调用setDefaultTimeZone:执行设置.如果你还没有这样做,这个电话和拨打systemTimeZone是一样的.

100

这就是它变得有点棘手的地方.localTimeZone给出的结果与defaultTimeZone几乎相同.不同之处在于,从localTimeZone中获得的特定NSTimeZone实例将始终反映您在应用程序中对时区所做的设置.您可以调用它一次,保存结果,并始终通过该对象获取当前模拟时区,无论所做的更改如何.这就好像,当您使用这个NSTimeZone实例时,框架正在为您调用defaultTimeZone,以确保您始终获得当前值.

以下是上述情况的几个简要说明.您从systemTimeZone返回的NSTimeZone对象代表您拨打电话时的系统时区.如果你再次拨打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仍受系统时区的应用程序级缓存的约束.它只会根据您设定的default时区进行更改

Objective-c相关问答推荐

Objective-C struct 的默认值以及如何测试

如何判断 iPhone 现在在哪个位置(横向或纵向)?

等到多个网络请求都执行完毕 - 包括它们的完成块

按住自定义 UIButton 时更改深灰色突出显示的 colored颜色 ?

多个 WKWebView 之间的 Cookie 共享

MKMapView zoom 到 viewDidLoad 上的用户位置?

Objective-C:在字符串中查找数字

iOS 心率检测算法

改变 RGB colored颜色 的色调

如果用户点击屏幕键盘,我如何关闭键盘?

ARC的正确桥接?

声明变量id和NSObject *有什么区别?

Objective-C 的 Eclipse 插件?

UIWebView 不会zoom 内容以适应

显示启动画面的时间超过默认秒数

Objective-C 中的属性和实例变量

如何将 NSOperationQueue 与 NSURLSession 一起使用?

交换 NSMutableArray 中的元素

在objective c中以自定义格式获取当前时间

如何使用图像和标签制作自定义 UIBarButtonItem?