在Julian Day计算器上编写一些单元测试时,我发现NSDate错误地初始化了1847年12月2日之前的日期。他们似乎有75秒加入。我找不到任何指向该日期的东西(这是在公历截止日期之后)。这是一个错误还是我没有遇到历史性的日历调整?
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
答案 0 :(得分:93)
根据http://www.timeanddate.com/worldclock/clockchange.html?n=136&year=1847,当时有75秒的时间向前移动。
在伦敦,当地时间即将于1847年12月1日星期三凌晨12点00分到达时,时钟被提前到1847年12月1日星期三12:01:15。
答案 1 :(得分:22)
在回复the post by Richard Krajunus时,以下是大多数计算机用来跟踪这些变化的zoneinfo database的其他信息:
# 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认为我还不值得。
答案 2 :(得分:1)
这是一个错误还是我没有遇到历史性的日历调整?
过去,日历曾多次...... 已修复。
查看Julian和Gregorian日历的维基百科文章的“采用”部分。
然而,NSDate实例应始终显示其初始化的时区的正确日期。
答案 3 :(得分:0)
NSDateComponents正在使用您当地的时区。尝试将timeZone设置为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