【问题标题】:Does [NSDate date] return the local date and time?[NSDate date] 是否返回本地日期和时间?
【发布时间】:2011-07-10 01:17:18
【问题描述】:

我傻吗?一直以来,我都认为 [NSDate date] 返回了本地日期和时间。今天在遇到 NSStringformatter/stringFromdate/dateFromString 问题后,我注意到我的 [NSDate date] 返回 2011-03-06 11:00:00 +0000。对此进行研究后,我发现 [NSDate date] 返回一个始终为 GMT 的原始日期。

如果 gmt 偏移部分总是显示 +0000,它有什么作用?我也不明白 [myDate description]。文档说它应该显示 gmt 偏移量以及 dst 信息。我得到与 [NSDate 日期] 相同的东西。

对我来说,如果我使用 [NSDate date] 来获取当前日期并且是在下午 2 点之后,我会得到明天的日期,因为我在 -10 时区。更不用说我今天在使用 NSDateformatter 时遇到的问题。

我看对了吗?有趣的是我似乎记得看到 [NSDate date] 返回 2011-03-06 11:00:00 -36000,或者我认为我看到的是 2011-03-06 11:00:00 -10000。

我可以使用它,但也许有人可以对此进行阐述以帮助我更好地理解 NSDate。

【问题讨论】:

  • +[NSDate date] 返回一个日期对象,该对象自动释放并具有当前时间。它与-[NSDate description] 显示相同的原因是NSLog 在使用%@ 时使用对象的description 属性。
  • @RadekS 这应该是一个答案。因为它是。 :)

标签: iphone cocoa-touch nsdate


【解决方案1】:

NSDate 返回当前日期。虽然它可以在不同的语言环境/时区转换字符串格式,但 NSDate 没有时区的内部概念。 NSDates 不受任何特定区域的约束。如果您和世界上任何其他人同时要求您的设备 [NSDate 日期],您将获得相同的结果 - 不是因为它总是在 GMT 时返回,而是因为它不会以特定于时区的方式返回。在 Cocoa 中,日期是地球历史上的特定时刻。日期的书写方式与日历、时区和地区有关。

你没有得到明天的日期,你得到了正确的日期,然后注意到它给出了一个不同的日期,如果以 GMT 表示。这是正确的日期,只是写的与您想要的不同。

'description' 是一个从 NSObject 重写的方法。当您 NSLog 一个对象时,内部发生的是调用描述方法并打印返回的字符串。所以你应该从记录object[object description] 得到相同的结果,因为前者调用描述并打印该字符串,后者调用描述然后调用结果字符串的描述并打印它。 NSStrings 作为描述的结果返回自己。

这应该是默认行为,但要获得有意义的描述,请尝试:

NSLog(@"%@", [[NSDate date] descriptionWithCalendarFormat:nil 
           timeZone:[NSTimeZone localTimeZone] locale:[NSLocale currentLocale]]);

如果仍然登录 GMT,那么您的设备会认为自己处于 GMT 状态。我不知道模拟器对这类事情有多可靠。

【讨论】:

  • 汤米,谢谢。这很有帮助。关于你关于它给我明天日期的陈述。我明白你的意思,但对我来说,我希望得到我所在时区的日期(本地日期和时间),所以对我来说是明天的日期。我认为这只是语义的一个例子,但出于所有意图和目的,[NSDate date] 不会返回 GMT,因为 GMT 是零时区。很好的答案 - 谢谢。
  • 您介意再回答一个问题吗?我无法理解文档中关于 [NSTimeZone localTimeZone] 的内容。它说它“返回一个将所有消息转发到当前应用程序的默认时区的对象”。那是什么意思。对我来说,这意味着调用它会以某种方式影响带有日期或时间的后续操作。谢谢。
  • 我认为稍微迂回的措辞只是因为即使时区发生变化,localTimeZone 返回的对象在语义上仍然是正确的,而 defaultTimeZone 不会。所以第一个对象似乎会自动更新,但第二个对象不会。这在内部是一个额外的间接级别,但感觉他们可能告诉我们的可能比我们需要知道的那里的实现更多。
  • 汤米,再次感谢。这确实帮助我揭开了 localTimeZone 和 defaultTimeZone 的神秘面纱。
  • 我想指出的是,从 OSX 10.10 开始,方法- descriptionWithCalendarFormat:timeZone:locale: 已被删除。
【解决方案2】:

Swift 中:

NSDate() 给我们一个不可知的日期描述,它总是返回 UTC+0 日期时间,与设备的时区无关:

print(NSDate())

.descriptionWithLocale(NSLocale.currentLocale())! 为我们提供本地化日期的描述 UTC+N 日期时间,其中 N 表示 UTC+0 与当前本地日期之间的偏移量(正或负)时间:

print(NSDate().descriptionWithLocale(NSLocale.currentLocale())!)

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • 我目前正在与NSDate合作,所以我会逐步完善我的答案和解释。
  • NSDate 没有时区。它不是 UTC+0。
猜你喜欢
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多