346 Stimmen

Warum ist der Januar im Java-Kalender der Monat 0?

En java.util.Calendar Der Januar ist als Monat 0 definiert, nicht als Monat 1. Gibt es dafür einen bestimmten Grund?

Ich habe gesehen, wie viele Leute darüber verwirrt waren...

11voto

TheSmurf Punkte 15101

Ich würde sagen, Faulheit. Arrays beginnen bei 0 (das weiß jeder); die Monate des Jahres sind ein Array, was mich zu der Annahme veranlasst, dass irgendein Ingenieur bei Sun sich einfach nicht die Mühe gemacht hat, diese eine kleine Nettigkeit in den Java-Code einzubauen.

9voto

Paul Tomblin Punkte 172816

Wahrscheinlich, weil C's "struct tm" das gleiche tut.

8voto

Dinah Punkte 50664

Weil Programmierer von 0-basierten Indizes besessen sind. OK, es ist ein bisschen komplizierter als das: Es macht mehr Sinn, wenn Sie mit Logik auf niedrigerer Ebene arbeiten, 0-basierte Indizes zu verwenden. Aber im Großen und Ganzen bleibe ich bei meinem ersten Satz.

5voto

Ole V.V. Punkte 75494

Der wahre Grund dafür

Man sollte meinen, dass wir mit der Abschaffung des größten Teils von Date und der Einführung der neuen Kalenderklasse hinzugefügt haben, hätten wir das größte Ärgernis von Date behoben: die Tatsache dass Januar der Monat 0 ist. Das hätten wir sicherlich tun sollen, aber leider haben wir es nicht getan. Wir befürchteten, dass die Programmierer verwirrt sein würden, wenn Date nullbasierte Monate und Calendar einbasierte Monate verwendet. Und ein paar Programmierer wären wahrscheinlich verwirrt gewesen. Aber im Nachhinein betrachtet, ist die Tatsache, dass Kalender immer noch nullbasiert ist, hat zu einer enormen Menge an Verwirrung gestiftet, und es war wahrscheinlich der größte einzelne Fehler in den internationalen Java internationalen API's.

Zitiert von Internationale Kalender in Java von Laura Werner, Link am Ende des Textes.

Die bessere Alternative: java.time

Vielleicht wiederhole ich nur, was andere gesagt haben: Wirf die alten und schlecht gestalteten Calendar Klasse über Bord und verwenden java.time, die moderne Java-API für Datum und Uhrzeit. Dort sind die Monate durchweg vernünftig nummeriert, von 1 für Januar bis 12 für Dezember.

Wenn Sie eine Calendar von einer veralteten API, die noch nicht auf java.time aktualisiert wurde, ist als erstes eine Konvertierung zu einer modernen ZonedDateTime . Je nach Ihrem Bedarf können Sie von dort aus weitere Umrechnungen vornehmen. In den meisten Ländern der Welt ist die Calendar Objekt, das Sie erhalten, ist praktisch immer eine Instanz der GregorianCalendar Unterklasse (da die Calendar Klasse selbst ist abstrakt). Zu demonstrieren:

    Calendar oldfashionedCalendarObject = Calendar.getInstance();
    ZonedDateTime zdt
            = ((GregorianCalendar) oldfashionedCalendarObject).toZonedDateTime();

    System.out.println(zdt);
    System.out.format("Month is %d or %s%n", zdt.getMonthValue(), zdt.getMonth());

Ausgabe, als ich soeben in meiner Zeitzone lief:

2021-03-17T23:18:47.761+01:00[Europe/Copenhagen]
Month is 3 or MARCH

Links

5voto

Digital_Reality Punkte 4200

java.time.Month

Java bietet Ihnen eine weitere Möglichkeit, 1-basierte Indizes für Monate zu verwenden. Verwenden Sie die java.time.Month enum. Für jeden der zwölf Monate ist ein Objekt vordefiniert. Ihnen sind jeweils Nummern von 1-12 für Januar-Dezember zugewiesen; Aufruf getValue für die Nummer.

Benutzen Sie Month.JULY (Gibt Ihnen 7) anstelle von Calendar.JULY (Gibt dir 6).

(import java.time.*;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X