Objective-C: Abrufen der Anzahl der Tage in einem Kalenderjahr

8

Ich verwende die folgende Methode NSCalendar , um die Anzahl der Tage in einem Kalenderjahr zu erhalten:

%Vor%

Ich erwarte einen range.length Rückgabewert vom Typ NSRange , der 365 oder 366 (Tage) ist.

Dieser Code gibt jedoch range.length von 31 für einen Datumswert von 2005-06-06 zurück.

Was ist falsch an meinem Code?

Dies ist das vollständige Code-Snippet:

%Vor%     
AlexR 18.02.2013, 16:38
quelle

4 Antworten

2

Dies berechnet die Anzahl der Tage eines Jahres eines bestimmten Datums:

%Vor%

Traurige Einschränkung: Dies funktioniert nicht richtig für das Jahr 1582.

Das Jahr 1582, das Jahr, in dem Gregor den derzeit verbreiteten gebrauchten Kalender einführte, brauchte eine Lösung, um die Sonnenenergie mit den Kalenderjahren in Einklang zu bringen. Sie gingen also mit der pragmatischen Lösung: Sie ließen den 5. bis 14. Oktober einfach fallen. (Sie waren nicht verrückt genug, um auch die Wochentage zu wechseln). Infolgedessen hat das Jahr 1582 nur 355 Tage.

Addendum: Der obige Code funktioniert nur für Jahre nach 1582. Er gibt 365 Tage für das Jahr 1500 zurück, obwohl dieses Jahr zum Beispiel ein Schaltjahr im damals verwendeten Julianischen Kalender war. Der Gregorianische Kalender beginnt am 15. Oktober 1582. Berechnungen, die im Gregorianischen Kalender gemacht wurden, sind vor diesem Datum nicht definiert. Auf diese Weise ist Apples Implementierung korrekt. Mir ist keine korrekte Implementierung für Jahre vor 1583 auf Cocoa bekannt.

    
Nikolai Ruhe 18.02.2013, 18:00
quelle
1

Hier ist eine relativ saubere Version. Es ist eine Kategorie auf NSCalendar.

%Vor%

Danke an AKV für den Hinweis, dass -components:fromDate:toDate:options in diesem Fall funktioniert.

Das scheint für 1582 oder früher nicht zu funktionieren, was laut Nikolai Ruhes Antwort darauf zurückzuführen ist, dass Gregorianische Kalenderberechnungen vorher einfach nicht definiert sind.

    
paulmelnikow 18.02.2013 17:57
quelle
1

Wie wäre es mit der Suche nach einer Anzahl von Tagen in einem bestimmten Jahr? Obwohl dies nicht die relative Lösung für die Frage ist.

%Vor%

Bearbeiten:

Da dateWithString: veraltet ist, können Sie

verwenden %Vor%

um date1 und date2

zu bilden     
Anoop Vaidya 18.02.2013 17:32
quelle
0

Sie erhalten die Anzahl der Tage im Monat Ihres Datums.

Sie könnten die gleiche Funktion verwenden und einfach ein Datum mit dem Monat Februar eingeben. Wenn range.length 28 zurückgibt, sind die Gesamttage im Jahr 365, wenn es 29 zurückgibt, dann ist die Anzahl der Tage 366.

    
Adam Johnson 18.02.2013 16:44
quelle