额外的75秒来自哪里?

在编写朱利安日计算器的unit testing时,我发现1847年12月2日之前的date被NSDate错误地初始化。 他们似乎有75秒的时间。 我一直没有find指向那个date的东西(这是在公历截止之后)。 这是一个错误还是有历史的日历调整,我没有遇到?

int main(int argc, const char * argv[]) { @autoreleasepool { NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *dateComps = [NSDateComponents new]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 1; NSDate *d1 = [cal dateFromComponents:dateComps]; NSLog(@"d1 = %@", d1); dateComps = [NSDateComponents new]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 2; NSDate *d2 = [cal dateFromComponents:dateComps]; NSLog(@"d2 = %@", d2); } return 0; } 

输出:

d1 = 1847-12-01 00:01:15 +0000

d2 = 1847-12-02 00:00:00 +0000

根据http://www.timeanddate.com/worldclock/clockchange.html?n=136&year=1847 ,当时有75秒的时间转移。

在伦敦,当地时间即将到达1847年12月1日星期三中午12点,钟表被推进到1847年12月1日星期三上午12点1分15秒。

为了回应Richard Krajunus的文章,大多数计算机使用的zoneinfo数据库提供了一些额外的信息来跟踪这些变化:

 # From Paul Eggert (1993-11-18): # # Howse writes that Britain was the first country to use standard time. # The railways cared most about the inconsistencies of local mean time, # and it was they who forced a uniform time on the country. # The original idea was credited to Dr. William Hyde Wollaston (1766-1828) # and was popularized by Abraham Follett Osler (1808-1903). # The first railway to adopt London time was the Great Western Railway # in November 1840; other railways followed suit, and by 1847 most # (though not all) railways used London time. On 1847-09-22 the # Railway Clearing House, an industry standards body, recommended that GMT be # adopted at all stations as soon as the General Post Office permitted it. # The transition occurred on 12-01 for the L&NW, the Caledonian, # and presumably other railways; the January 1848 Bradshaw's lists many # railways as using GMT. By 1855 the vast majority of public # clocks in Britain were set to GMT (though some, like the great clock # on Tom Tower at Christ Church, Oxford, were fitted with two minute hands, # one for local time and one for GMT). The last major holdout was the legal # system, which stubbornly stuck to local time for many years, leading # to oddities like polls opening at 08:13 and closing at 16:13. # The legal system finally switched to GMT when the Statutes (Definition # of Time) Act took effect; it received the Royal Assent on 1880-08-02. # # In the tables below, we condense this complicated story into a single # transition date for London, namely 1847-12-01. We don't know as much # about Dublin, so we use 1880-08-02, the legal transition time. 

对不起,我无法在该线程中使用注释。 StackOverflow不认为我值得这一点呢。

如果您正在进行任何types的date/时间操作,则需要“日历常见问题解答” 。 它回答这个问题。

这是一个错误还是有历史的日历调整,我没有遇到?

日历已经有很多次了……过去是固定的。

查看维基百科文章中“采用”部分的Julian和Gregorian日历。

然而NSDate实例应该始终显示正确的date,不pipe它初始化的是什么时区。

NSDateComponents正在使用您当地的时区。 尝试设置时区到UTC?

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *dateComps = [NSDateComponents new]; dateComps.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 1; NSDate *d1 = [cal dateFromComponents:dateComps]; NSLog(@"d1 = %@", d1); dateComps = [NSDateComponents new]; dateComps.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; dateComps.year = 1847; dateComps.month = 12; dateComps.day = 2; NSDate *d2 = [cal dateFromComponents:dateComps]; NSLog(@"d2 = %@", d2); [19875:60b] d1 = 1847-12-01 00:00:00 +0000 [19875:60b] d2 = 1847-12-02 00:00:00 +0000