[NSDate date]是否返回本地日期和时间?

时间:2011-03-07 01:42:35

标签: iphone cocoa-touch nsdate

我是傻瓜吗?一直以来我都认为[NSDate date]返回了当地的日期和时间。今天在NSStringformatter / stringFromdate / dateFromString遇到麻烦后,我发现我的[NSDate日期]正在返回2011-03-06 11:00:00 +0000。在研究完之后,我看到[NSDate date]返回一个始终为GMT的原始日期。

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

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

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

我可以使用它,但也许有人可以解释这一点,以帮助我更好地理解NSDate。

2 个答案:

答案 0 :(得分:20)

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

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

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

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

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

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

答案 1 :(得分:-1)

Swift

NSDate()为我们提供了一个不可知日期的描述,它始终返回UTC + 0日期时间,与设备的时区无关:

print(NSDate())

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

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