【问题标题】:iPhone - Differences among time zone convenience methodsiPhone - 时区便利方法之间的差异
【发布时间】:2011-05-12 22:58:42
【问题描述】:

我看到NSTimeZone 有这些方法:

defaultTimeZone  
localTimeZone  
systemTimeZone

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

【问题讨论】:

    标签: objective-c cocoa-touch ios nstimezone


    【解决方案1】:

    可以肯定的是,文档中的语言有点枯燥,而且名称的相似性可能会造成混淆。我将在此处引用NSTimeZone docs 并尝试对其进行解释:

    systemTimeZone
    系统当前使用的时区。如果无法确定当前时区,则返回 GMT 时区。

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

    defaultTimeZone
    当前应用程序的默认时区。如果没有设置默认时区,该方法调用systemTimeZone并返回系统时区。

    您的应用程序可以设置自己的时区,这样您就可以像设备在另一个时区一样执行操作,但不会影响系统时区(进而影响其他应用程序)。通过调用setDefaultTimeZone: 来执行设置。如果您还没有这样做,则此调用与调用 systemTimeZone 相同。

    localTimeZone
    将所有消息转发到当前应用程序的默认时区的对象。本地时区始终代表默认时区的当前状态。

    这是有点棘手的地方。 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 usinglocalTimeZone

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


    *注意localTimeZone仍然受制于系统时区的app级缓存。它只会随着您的默认时区设置而改变。

    【讨论】:

    • 我不明白 defaultTimeZone 和 localTimeZone 之间的区别。我知道 systemTimeZone 是系统首选项中定义的一个,如果有一个或设备位置。 defaultTimeZone 是模拟到应用程序中的时间,如果没有在应用程序中模拟,则为系统时间。那么...... localTimeZone 有什么用?您对 localTimeZone 的说法似乎与您对 defaultTimeZone 的说法相同。你能在这一点上完成你的答案吗?
    • @Oliver:你说得对,localTimeZone 给你的结果几乎和defaultTimeZone 一样。我试图在答案末尾说明唯一的区别:您从 localTimeZone 获得的特定 NSTimeZone 对象将始终反映您对应用程序中的时区所做的设置。您可以调用一次,保存对象,并始终通过该对象获取当前模拟时区,无论进行了何种更改。就好像,当您使用这个对象时,框架每次都在为您调用defaultTimeZone,以确保始终获取当前值。这有帮助吗?
    • 这很清楚。我了解使用包含调用 localTimeZone 的结果的任何变量都将反映更改。但这不会发生在包含defaultTimeZone 结果的变量中。是这样吗?
    • 如果这就是您的意思,您能否提取评论并将其放入您的答案中?
    • 这个答案是否仍然适用于 iOS9?我只是通过在我的应用程序中调用[NSTimeZone systemTimeZone] 进行了一个简单的测试,更改了我设备中的时区(无需重新启动应用程序),然后再次调用它。在每次调用中返回设备的当前时区(即,第一次调用没有缓存,我也没有调用+resetSystemTimeZone)。
    猜你喜欢
    • 2018-09-16
    • 2015-07-13
    • 2018-12-18
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2012-10-31
    • 2012-04-09
    • 2016-08-16
    相关资源
    最近更新 更多