Objective c 设置NSDateComponents会导致NSDate不正确

Objective c 设置NSDateComponents会导致NSDate不正确,objective-c,ios,nsdate,nsdatecomponents,Objective C,Ios,Nsdate,Nsdatecomponents,我正在尝试获取一个NSDate对象,该对象的本地时间为21:00-不关心哪一天。这个非常奇怪的结果让我挠头: NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setHour:21]; [components set

我正在尝试获取一个NSDate对象,该对象的本地时间为21:00-不关心哪一天。这个非常奇怪的结果让我挠头:

NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setHour:21];
[components setMinute:0];
[components setSecond:0];

NSDate *date = [calendar dateFromComponents:components];
NSLog(@"%@", date);
结果是
0001-01-02 04:52:58+0000

我不知道为什么。当前时间为太平洋标准时间17:34,但结果不会随当地时间而改变

如果我将setMinute和setSecond行调整为

[components setMinute:7];
[components setSecond:2];

我得到的
0001-01-02 05:00:00+0000
,这是正确的(太平洋标准时间21:00)。

问题是铁路时间直到1883年11月18日才实施。你忘了定一年,所以你在那之前就有了一个日期。在铁路时间实施之前,,美国时区与格林尼治标准时间的时差不完全相同。我不确定苹果公司为您选择的时区到底是什么,但不管是哪一个时区,在1883年转到太平洋标准时间后,似乎已经调整了7分2秒。

如果您将年份设置为2012年,您会得到什么?不知为什么,您的时区设置得很奇怪。或者NSDateFormatter试图解释2000年的闰秒数。@B这一点已经解决了!请随意回答,我会接受。奇怪的是,获得额外7分2秒的转换年份似乎是1884年——即1883年为04:52:58,1884年为05:00:00。有人能看出其中有什么意义吗?(编辑:不,我已经明白了:PST是标准化的),他们总是选择了旧金山太阳时间或是这样的时间。我的CA购买的Mac设置为Cupertino,我不记得自己在任何时候都设置过。所以我猜他们要么提名库比蒂诺为前铁路PST的代表,要么,可能,他们将实际使用最近的城市。+1-很好的解释。我知道那一年,时区把它修好了,但不知道确切的原因。很高兴知道。当然,他们不可能重现美国复杂的计时历史,甚至可以追溯到大约20年前。特别是在1965年以前,城市会单独决定是否使用DST,有些城市会采用完全不同的时区,以便与更大的邻居“保持时间”。在其他地方尝试这一做法会很有趣。