ios - NSDate 似乎如何知道它是 TimeZone?

标签 ios nsdate nsdateformatter

我对这两个 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

它怎么知道第一个日期是 GMT 而第二个是 BST?

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

最佳答案

没错,NSDate 没有时区。您的结果并不矛盾,因为您没有打印日期——您打印的是通过日期格式化程序传递日期信息而生成的日期信息的子集。您的 currentFormatter 只返回一天中的时间信息,而不是日期信息。如果添加此行:

[currentFormatter setDateStyle:NSDateFormatterLongStyle];

然后结果会是这样的:

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

换句话说,它们会显示不同的时区,因为它们处于不同的日期,而时区反射(reflect)了该日期的生效时间。在我的例子中,它当前是 MDT,但在 2000 年 1 月 1 日它应该是 MST

关于ios - NSDate 似乎如何知道它是 TimeZone?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863677/

相关文章:

iphone - 比较相同日期/时间的两个 NSDates

ios - swift 中的日期格式问题

ios - Google Cast iOS SDK v3.3 存档上传问题

android - Apple Maps 和 Google Maps API 可行性

objective-c - 类与协议(protocol)之间有什么区别

ios - 在 Swift 中,DateFormatter 对于没有时间的特定日期字符串返回 nil

ios - 返回时区的 GMT 偏移量,包括夏令时

ios - 如何使用 Xcode 中的仪器检查堆内存?

iphone - 在 NSArray 中查找具有给定时间(例如晚上 8 点)之后的某个时间的 NSDate?

ios - 在 12 :00 AM 处动态创建前一个星期日的日期