java.util.Date und getYear()

Lesezeit: 6 Minuten

Benutzer-Avatar
johngoche9999

Ich habe das folgende Problem in Java (ich sehe, dass einige Leute ein ähnliches Problem in JavaScript haben, aber ich verwende Java)

System.out.println(new Date().getYear());
System.out.println(new GregorianCalendar().getTime().getYear());
System.out.println(this.sale.getSaleDate().getYear());
System.out.println(this.sale.getSaleDate().getMonth());
System.out.println(this.sale.getSaleDate().getDate());

kehrt zurück

I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 1
I/System.out( 4274): 11

Ich verstehe das 112-Bit nicht, von dem ich dachte, es wäre 2012. Was ist los? Ist der
java.util.Date Klasse unbrauchbar? Ich speichere dies als Feld in mehreren meiner Klassen, um ein Datum und eine Uhrzeit zu speichern. Was soll ich machen?

  • Liebes OP, es liegt daran, dass es in der Klasse 1900 davon subtrahiert, um das Jahr zu erhalten, fügen Sie bitte 1900 hinzu.@Deprecated public int getYear() { return normalize().getYear() - 1900; })

    – Dämonen-App-Programmierer

    28. Juni 2019 um 17:57 Uhr

  • Während getYear Methode wurde 14 Jahre bevor diese Frage gestellt wurde, insgesamt abgelehnt Date Klasse wurde später durch ersetzt java.time, die moderne Java-API für Datum und Uhrzeit. Verwenden Sie zum Beispiel a LocalDate Anstatt von Date. Und seien Sie völlig frei von solchen Überraschungen.

    – Ole VV

    16. April 2020 um 18:19 Uhr

Zusätzlich zu all den Kommentaren dachte ich, ich könnte etwas Code hinzufügen, wie man java.util.Date, java.util.Calendar und java.util.GregorianCalendar entsprechend verwendet javadoc.

//Initialize your Date however you like it.
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
//Add one to month {0 - 11}
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);

Benutzer-Avatar
Peter Schwensson

Laut Javadocs:

@Deprecated
public int getYear()

Veraltet. Ab JDK-Version 1.1 ersetzt durch Calendar.get(Calendar.YEAR) - 1900.

Gibt einen Wert zurück, der das Ergebnis der Subtraktion von 1900 von dem Jahr ist, das den durch dieses Date-Objekt repräsentierten Zeitpunkt enthält oder damit beginnt, wie in der lokalen Zeitzone interpretiert.

Kehrt zurück:
das durch dieses Datum dargestellte Jahr minus 1900.

Siehe auch:
Kalender

112 ist also die richtige Ausgabe. Ich würde den Ratschlägen im Javadoc folgen oder stattdessen JodaTime verwenden.

  • die korrekte Umsetzung einer völlig bizarren Spezifikation!

    – JonnyRaa

    12. Mai 2014 um 15:40 Uhr

  • Ist das der Y2K-Bug?

    – springnett

    20. September 2017 um 0:36 Uhr

  • @jumpnett – nein, das ist überhaupt kein Fehler, es funktioniert genau so, wie es soll. Es gibt das aktuelle Jahr versetzt um 1900 zurück. Warum jemand bei Sun das für eine gute Idee hielt, ist eine ganz andere Frage.

    – Dawor

    16. Januar 2018 um 14:23 Uhr

  • Muss Praktikant gewesen sein, obwohl ich gerne hören würde, was Sun dazu zu sagen hat

    – TheRealChx101

    28. April 2020 um 20:25 Uhr

Datumsformat verwenden

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(datetime);
SimpleDateFormat df = new SimpleDateFormat("yyyy");
year = df.format(date);

Benutzer-Avatar
Konstantin Spirin

Nicht verwenden Dateverwenden Calendar:

// Beware: months are zero-based and no out of range errors are reported
Calendar date = new GregorianCalendar(2012, 9, 5);
int year = date.get(Calendar.YEAR);  // 2012
int month = date.get(Calendar.MONTH);  // 9 - October!!!
int day = date.get(Calendar.DAY_OF_MONTH);  // 5

Es unterstützt auch die Zeit:

Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17);
int hour = dateTime.get(Calendar.HOUR_OF_DAY);  // 15
int minute = dateTime.get(Calendar.MINUTE);  // 16
int second = dateTime.get(Calendar.SECOND);  // 17

Die Java-Dokumentation schlägt vor, die Kalenderklasse anstelle dieser veralteten Methode zu verwenden. Hier ist der Beispielcode zum Einrichten des Kalenderobjekts

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());

Hier ist der Beispielcode zum Abrufen von Jahr, Monat usw.

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));

Der Kalender unterstützt auch viele andere nützliche Informationen wie TIME, DAY_OF_MONTH usw. Hier die Dokumentation alle auflisten Bitte beachten Sie, dass die Monate auf 0 basieren. Januar ist der 0. Monat.

tl;dr

LocalDate.now()       // Capture the date-only value current in the JVM’s current default time zone.
         .getYear()   // Extract the year number from that date.

2018

java.time

Beide java.util.Date und java.util.Calendar Klassen sind Legacy-Klassen, die jetzt durch das java.time-Framework ersetzt werden, das in Java 8 und höher integriert ist.

Eine Zeitzone ist entscheidend für die Bestimmung eines Datums. Für jeden bestimmten Moment variiert das Datum rund um den Globus je nach Zone. Zum Beispiel ein paar Minuten nach Mitternacht in Paris, Frankreich ist ein neuer Tag, während noch „gestern“ drin ist Montreal, Quebec.

Wenn keine Zeitzone angegeben ist, wendet die JVM implizit ihre aktuelle Standardzeitzone an. Diese Standardeinstellung kann sich jederzeit ändern, sodass Ihre Ergebnisse variieren können. Geben Sie Ihre gewünschte/erwartete Zeitzone besser explizit als Argument an.

Geben Sie a an richtiger Zeitzonenname im Format von continent/regionwie zum Beispiel America/Montreal, Africa/Casablancaoder Pacific/Auckland. Verwenden Sie niemals die 3-4-Buchstaben-Abkürzung wie z EST oder IST so wie sie sind nicht echte Zeitzonen, nicht standardisiert und nicht einmal eindeutig (!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  

Wenn Sie nur das Datum ohne Uhrzeit wünschen, verwenden Sie LocalDate. Dieser Klasse fehlen Zeitzoneninformationen, aber Sie können eine Zeitzone angeben, um das aktuelle Datum zu bestimmen.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( zoneId );

Sie können die verschiedenen Informationen mit erhalten getYear, getMonthund getDayOfMonth. Sie erhalten die Jahreszahl tatsächlich mit java.time!

int year = localDate.getYear();

2016

Wenn Sie statt nur eines Datums ein Datum und eine Uhrzeit wünschen, verwenden Sie ZonedDateTime Klasse.

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

Über java.time

Das java.time Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Datums-Zeit-Klassen wie z java.util.Date, .Calendar& java.text.SimpleDateFormat.

Das Joda-Zeit Projekt, jetzt in Wartungsmodusrät zur Migration in die java.time Klassen.

Weitere Informationen finden Sie unter Oracle-Tutorial. Und durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen.

Viel von der java.time Funktionalität ist zurückportiert auf Java 6 & Java 7 in ThreeTen-Backport und weiter angepasst Android in ThreeTenABP (sehen Wie benutzt man…).

Das ThreeTen-Extra project erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen zu java.time. Sie können hier einige nützliche Klassen finden, wie z Interval, YearWeek, YearQuarterund mehr.

Yup, das ist in der Tat, was passiert. Siehe auch die Javadoc:

Returns:
   the year represented by this date, minus 1900.

Die getYear-Methode ist aus diesem Grund veraltet. Also nicht verwenden.

Beachten Sie auch, dass getMonth eine Zahl zwischen 0 und 11 zurückgibt. this.sale.getSaleDate().getMonth() gibt 1 für Februar statt 2 zurück. While java.util.Calendar nicht zu allen Jahren 1900 hinzufügt, leidet es unter dem Problem der Abweichung von einem Monat.

Sie sind viel besser dran mit JodaZeit.

1176600cookie-checkjava.util.Date und getYear()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy