【问题标题】:Does NSDate change based on the device's current location? Or is it independent?NSDate 是否会根据设备的当前位置而改变?还是独立的?
【发布时间】:2014-05-01 06:13:11
【问题描述】:

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

[NSDate date];

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

【问题讨论】:

标签: ios nsdate


【解决方案1】:

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

NSDate 的实例不包含任何时区信息。它本质上是对 2001 年 1 月 1 日的偏移。

来自 Apple 的 NSDate 文档:

NSDate 对象代表一个时间点。

后面会提到

... NSDate 使用的绝对参考日期(第一个实例是 2001 年 1 月 1 日,格林威治标准时间)。

时区(或NSTimezone 对象)可以结合NSDateNSCalendar 对象一起使用,然后可以通过NSDateFormatter 格式化以进行显示。

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

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

【讨论】:

  • 因此,如果我在 Boston 设置 NSDate 为 4:00 ,并在 San Fransisco 访问它,将是 1:00 或 Boston 是 4:00 和 San Fransisco 将是:1:00
  • 波士顿是格林威治标准时间 -4。如果您在格林威治标准时间 04:00 (4AM) 在设置为 GMT-4 的设备上调用 [NSDate date],NSDate 将存储格林威治标准时间 08:00 的绝对值。如果你在 SFO (GMT -8) 的同一时间 00:00(午夜)做同样的事情,内部 NSDate 值将是相同的。
【解决方案2】:

如果您的应用有一个在按下时调用 [NSDate date] 的按钮,那么我们都在运行该应用,您在电话上给我打电话,我们同时按下按钮,我们将获得相同的 NSDate。如果app调用NSLog(@"%@", [NSDate date]);我们将看到相同的输出。例如,我们可以比较这些数字,发现您比我早 0.376 秒按下了按钮。

现在,如果您有“现在是哪一年”之类的问题,仅靠 NSDate 是无法回答的。您必须提供 NSLocale,正是因为同一时间点在一个国家/地区可能仍然是 2014 年,而在另一个国家/地区可能仍然是 2015 年。

因此,如果您将手机从波士顿搬到旧金山,NSDate 不会改变,但系统区域设置会改变,显示的时间也会改变。这就是如果您不小心,可能会出现细微错误的原因之一:假设您设置了一个闹钟,每天早上 8 点将您叫醒。如果程序员使用 NSDate 编写了让闹钟每 24 小时运行一次的代码,那么从波士顿搬到旧金山可能意味着你在错误的时间被叫醒 - 比上次闹钟晚了 24 小时,但是不是早上 8 点。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多