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

Iphone [NSDate date]是否返回本地日期和时间?,iphone,cocoa-touch,nsdate,Iphone,Cocoa Touch,Nsdate,我笨吗?一直以来,我都认为[NSDate date]返回了本地日期和时间。在使用NSStringformatter/stringFromdate/dateFromString遇到一些问题后,今天我注意到我的[NSDate date]返回2011-03-06 11:00:00+0000。经过研究,我发现[NSDate date]返回的原始日期总是GMT 如果gmt偏移部分总是显示+0000,那么它有什么用途?我也不明白[我的日期描述]。文件说它应该显示gmt偏移量和dst信息。我得到了与[NSDa

我笨吗?一直以来,我都认为[NSDate date]返回了本地日期和时间。在使用NSStringformatter/stringFromdate/dateFromString遇到一些问题后,今天我注意到我的[NSDate date]返回2011-03-06 11:00:00+0000。经过研究,我发现[NSDate date]返回的原始日期总是GMT

如果gmt偏移部分总是显示+0000,那么它有什么用途?我也不明白[我的日期描述]。文件说它应该显示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返回当前日期。尽管可以在不同的地区/时区转换字符串格式,但NSDate没有时区的内部概念。NSDATE不受任何特定区域的约束。如果您和世界上任何其他人要求您的设备同时[NSDate date],您会得到相同的结果——不是因为它总是以GMT返回,而是因为它不会以特定时区的方式返回。在可可中,日期是地球历史上的一个特定时刻。日期的书写方式与日历、时区和区域设置有关

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

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

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

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

如果仍在GMT中登录,则您的设备认为自己在GMT中。我不知道模拟器在这方面有多可靠。

Swift

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

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

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

+[NSDate-date]
返回一个日期对象,该对象自动删除并具有当前时间。它显示为与
-[NSDate description]
相同的原因是
NSLog
在使用
%@
时使用对象的
description
属性。@RadekS这应该是答案。原因是……)汤米,谢谢。这很有帮助。关于你关于此事的陈述,请告诉我明天的日期。我明白你的意思,但对我来说,我希望得到的日期在我的时区(当地日期和时间),所以对我来说,这是明天的日期。我认为这只是语义的一个例子,但出于所有目的,[NSDate]不会返回GMT,因为GMT是零时区。回答得很好-谢谢。你介意再回答一个问题吗?我很难理解文档中关于[NSTimeZone localTimeZone]的内容。它表示它“返回一个对象,该对象将所有消息转发到当前应用程序的默认时区”。这是什么意思。对我来说,这意味着调用它会以某种方式影响后续的日期或时间操作。谢谢。我认为这种略显迂回的措辞只是因为localTimeZone返回的对象在语义上保持正确,即使时区发生了变化,而defaultTimeZone没有。因此,第一个对象似乎会自动更新自身,但第二个对象不会。这在内部是一个额外的间接层次,但确实感觉他们告诉我们的关于实现的信息可能比我们需要知道的要多。Tommy,再次感谢。这确实帮助我揭开了localTimeZone和defaultTimeZone的神秘面纱。我想指出,自OSX 10.10以来,
-descriptionWithCalendarFormat:timeZone:locale:
方法已被删除。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。我目前正在与NSDate合作,因此我将逐步改进我的回答和解释。
NSDate
没有时区。它不是UTC+0。