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);
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.
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);
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
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.
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.
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.
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 abgelehntDate
Klasse wurde später durch ersetzt java.time, die moderne Java-API für Datum und Uhrzeit. Verwenden Sie zum Beispiel aLocalDate
Anstatt vonDate
. Und seien Sie völlig frei von solchen Überraschungen.– Ole VV
16. April 2020 um 18:19 Uhr