NSDate 似乎如何知道它是 TimeZone?

Posted

技术标签:

【中文标题】NSDate 似乎如何知道它是 TimeZone?【英文标题】:How does NSDate seem to know it's TimeZone? 【发布时间】:2015-09-30 10:23:20 【问题描述】:

我对这两个 NSDate 对象似乎如何知道它们所在的时区感到有些困惑。我的印象是 NSDate 对象只存储了一个时间点而没有关于时区的信息。

我正在创建和记录两个这样的日期:

NSString* timeString = @"6:04 PM";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"h:mm a"];
NSDate *time = [dateFormatter dateFromString:timeString];

NSDateFormatter *currentFormatter = [[NSDateFormatter alloc] init];
[currentFormatter setTimeStyle:NSDateFormatterLongStyle];
NSLog(@"%@", [currentFormatter stringFromDate:time]);
NSLog(@"%@", [currentFormatter stringFromDate:[NSDate date]]);

这会产生输出:

18:04:00 GMT
11:12:36 BST

它怎么知道第一个日期是格林威治标准时间,第二个是英国夏令时?

(这里是英国夏令时。在这方面您的里程可能会有所不同)

【问题讨论】:

你确定这是给我们这个输出的代码吗?我得到了与您的代码具有相同时区的输出。 是的,在 iPhone 6s 上运行 ios 9,我的地区设置为英国,时区设置为伦敦并开启 24 小时制。 Xcode 7.0.1。 澄清一下,我使用的是 iOS 9.0.1。 【参考方案1】:

你说得对,NSDate 没有时区。您的结果并不矛盾,因为您没有打印日期 - 您正在打印通过日期格式化程序传递它们产生的日期信息的子集。您的currentFormatter 只返回时间信息,而不是日期信息。如果添加这一行:

[currentFormatter setDateStyle:NSDateFormatterLongStyle];

然后结果将如下所示:

January 1, 2000 at 6:04:00 PM MST
September 30, 2015 at 11:14:39 AM MDT

换句话说,它们以不同的时区显示,因为它们位于不同的日期,而时区反映了该日期的实际情况。在我的情况下,它目前是 MDT,但在 2000 年 1 月 1 日,它应该是 MST

【讨论】:

以上是关于NSDate 似乎如何知道它是 TimeZone?的主要内容,如果未能解决你的问题,请参考以下文章

NSDate 和 TimeZone 问题

将 NSDate 的默认值设置为今天

一篇文章吃透iOSJS的时间日期(Date, Calendar, Locale, TimeZone)

SWIFT:如何为NSDate对象添加小时数

将 UTC 日期格式转换为本地 nsdate

可靠地检查 NSDate 是不是在给定的小时、天或周内