NSDate是否会根据设备的当前位置进行更改?还是独立的?

时间:2014-05-01 06:13:12

标签: ios nsdate

在我的应用中,我只是将当前日期视为:

[NSDate date];

那么,根据时区,它会有所不同吗?因此,2015年1月1日设备位置设置为澳大利亚,美国日期仍为2014年?

2 个答案:

答案 0 :(得分:2)

不,您上面的示例将产生一个与GMT时区绝对偏移的时间,并且不会根据设备的当前位置而改变,它是独立的。

NSDate的实例不包含任何时区信息。它基本上是1/1/2001的偏移量。

来自Apple的NSDate文档:

  

NSDate对象代表单个时间点。

稍后提及

  

...... NSDate使用的绝对参考日期(2001年1月1日GMT的第一个例子)。

时区(或NSTimezone个对象)可与结合使用NSDateNSCalendar个对象,然后可由NSDateFormatter格式化显示。

您可能还想查看[NSLocale systemLocale]及其兄弟方法,以获取有关iOS如何处理区域设置更改的更多信息。

关于日期和时间编程的一个很好的资源是Apple的Date and Time Programming Guide

答案 1 :(得分:0)

如果你的应用程序有一个按下按钮时调用[NSDate日期]的按钮,我们都在运行应用程序,你打电话给我,我们同时按下按钮,我们将得到相同的NSDate。如果应用程序调用NSLog(@“%@”,[NSDate日期]);我们会看到相同的输出。例如,我们可以比较这些数字并看到你在我做之前按下按钮0.376秒。

现在,如果您有“今年是哪一半”这样的问题,那么仅凭NSDate就无法回答。您必须提供NSLocale,因为同一时间点可能仍然是2014年的一个国家和2015年的另一个国家。

因此,如果您将手机从波士顿移至旧金山,NSDate不会更改,但系统区域设置将更改,并且显示的时间将更改。如果你不小心的话,这就是为什么细微的虫子可以悄悄进入的原因之一:假设你设置一个闹钟,每天早上8点叫醒你。如果程序员使用NSDate编写使警报每24小时运行的代码,那么从波士顿搬到旧金山可能意味着您在错误的时间被唤醒 - 比最后一次警报晚24小时,但是不是早上8点。