2014-02-20 7 views
44

Beim Schreiben einiger Komponententests an einem Julian-Day-Rechner habe ich festgestellt, dass Daten vor dem 2. Dezember 1847 von NSDate falsch initialisiert wurden. Sie scheinen 75 Sekunden hinzugefügt zu haben. Ich konnte nichts finden, was auf dieses Datum hinweist (das ist weit nach dem Gregorianischen Kalender). Ist es ein Fehler oder gibt es eine historische Kalenderanpassung, auf die ich nicht gestoßen bin?Woher kommen die zusätzlichen 75 Sekunden?

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; 
} 

Output:

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

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

+0

Ich habe Ihren Code kopiert, ohne irgendeine Änderung und das ist meine Ausgabe: ' d1 = 1847-12-01 00:00:00 -064116 || d2 = 1847-12-02 00:00:00 -064116' – Merlevede

Antwort

92

Nach http://www.timeanddate.com/worldclock/clockchange.html?n=136&year=1847 gab es eine Zeitverschiebung von 75 Sekunden zu dieser Zeit.

In London, als die Ortszeit am Mittwoch, dem 1. Dezember 1847, um 12:00 Uhr morgens war, wurden die Uhren bis Mittwoch, den 1. Dezember 1847 12:01:15 Uhr vorgestellt.

+0

Aha! Und rate mal, wo ich bin ... Danke. –

+26

Klammer dich. Upvotes kommen .. –

0

NSDateComponents verwenden Ihre lokale Zeitzone. Versuchen Sie, die Zeitzone auf UTC einzustellen?

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 
+0

Danke Eugene, ich habe deinen Code sowohl mit 'UTC' als auch 'GMT' (Meine Zeitzone in Turgis Green, England) als Zeitzone und beide ohne ausgegeben der 75-Sekunden-Offset. Andere Zeitzonen liefern ebenfalls interessante Ergebnisse. EST scheint um nicht 5 Stunden, sondern um 4h56m02s versetzt zu sein. PST von 7h52m58s. Alles sehr neugierig und alles, hoffe ich, aufgrund historischer Anpassungen und nicht von seltsamen Fehlern. –

+0

Das Geheimnis scheint, eine Zeitzone explizit festzulegen. Seltsamerweise, wenn ich 'GMT' auf die Zeitzone einstelle, erscheint der Code über den Ausgaben gemäß 'UTC', aber ich kann immer noch die 75 Sekunden sehen, wenn ich einen Datumsformatierer auf 'Z' verwende. –

1

Ist es ein Fehler oder gibt es eine historische Kalender Einstellung, dass ich nicht kommen über habe?

Es gab eine Reihe von Zeiten, in denen der Kalender ... in der Vergangenheit repariert wurde.

Überprüfen Sie die "Adoption" -Abschnitte der wikipedia Artikel für Julian und Gregorian Kalender.

Die NSDate-Instanz sollte jedoch stets das korrekte Datum für die Zeitzone anzeigen, mit der sie initialisiert wurde.

3

Wenn Sie irgendeine Art von Datum/Zeit manipulieren, müssen Sie die The Calendar FAQ. Es beantwortet alle Fragen wie diese.

21

Als Reaktion auf the post by Richard Krajunus, hier einige zusätzliche Informationen von den zoneinfo database von den meisten Computern verwendet, um diese Arten von Änderungen zu verfolgen:

# 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. 

Leider konnte ich nicht antworten Kommentar in diesem Thread verwendet wird; StackOverflow hält mich davon noch nicht für würdig.

+2

Dies sollte sowieso eine Antwort sein, also zwingt das System Sie, das Richtige zu tun. Erfolg! –