wake-up-neo.com

java.util.Date und getYear ()

Ich habe das folgende Problem in Java (Ich sehe, dass einige Leute ein ähnliches Problem in JavaScript haben.

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 nicht das 112-Bit, von dem ich dachte, dass es 2012 gewesen wäre. Ist die Klasse Java.util.Date unbrauchbar? Ich speichere dies als Feld in mehreren .__ meiner Klassen, um Datum und Uhrzeit zu speichern. Was soll ich machen?

45
johngoche9999

Nach 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 dargestellten Zeitpunkt enthält oder beginnt, wie in der lokalen Zeitzone interpretiert.

Rückgabe: Das durch dieses Datum dargestellte Jahr minus 1900.

Siehe auch:Kalender

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

51

Zusätzlich zu allen Kommentaren dachte ich, ich könnte etwas Code hinzufügen, wie man Java.util.Date, Java.util.Calendar und Java.util.GregorianCalendar verwendet, entsprechend dem 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);
54
fasholaide

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);
31
Mosiur

Verwenden Sie nicht Date, sondern 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
21

Ja, das ist tatsächlich das, was passiert. Siehe auch das Javadoc :

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

Die getYear-Methode ist aus diesem Grund veraltet. Verwenden Sie es also nicht.

Beachten Sie auch, dass getMonth eine Zahl zwischen 0 und 11 zurückgibt. Daher gibt this.sale.getSaleDate().getMonth() 1 statt 2 für Februar zurück. Während Java.util.Calendar nicht allen Jahren 1900 hinzufügt, leidet es unter dem Off-by-One-Monat-Problem.

Mit JodaTime ist es viel besser.

9
jqno

In der Java-Dokumentation wird vorgeschlagen, die Calendar-Klasse 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, um das Jahr, den Monat usw. abzurufen.

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 werden die Dokumentationen aufgeführt, die alle aufführen Bitte beachten Sie, dass der Monat 0 ist. Januar ist der 0. Monat.

7
Amol Dixit

Die Java 8 LocalDate-Klasse ist eine weitere Option, um das Jahr von einem Java.util.Date abzurufen.

int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear();

Eine andere Möglichkeit ist,

int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date));
7

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

Sowohl die Klassen Java.util.Date als auch Java.util.Calendar sind veraltet und werden jetzt durch das in Java 8 und höher integrierte Java.time-Framework ersetzt. 

Eine Zeitzone ist entscheidend für die Festlegung eines Datums. Für jeden Moment variiert das Datum auf der ganzen Welt nach Zone. Zum Beispiel ein paar Minuten nach Mitternacht in Paris Frankreich ist ein neuer Tag, während er noch "gestern" in Montréal Québec ist.

Wenn keine Zeitzone angegeben ist, wendet die JVM implizit die aktuelle Standardzeitzone an. Diese Standardeinstellung kann sich jederzeit ändern, so dass Ihre Ergebnisse variieren können. Besser die gewünschte/erwartete Zeitzone explizit als Argument angeben.

Geben Sie einen richtigen Zeitzonennamen im Format continent/region an, beispielsweise America/Montreal , Africa/Casablanca oder Pacific/Auckland. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST oder IST, da sie nicht Zeitzonen sind, nicht standardisiert und nicht einmal eindeutig (!). 

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

Wenn Sie nur das Datum ohne Uhrzeit wünschen, verwenden Sie LocalDate . Diese Klasse enthält keine Zeitzoneninformationen. Sie können jedoch 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 getYear, getMonth und getDayOfMonth abrufen. Sie erhalten tatsächlich die Jahreszahl mit Java.time!

int year = localDate.getYear();

2016

Wenn Sie ein Datum und eine Uhrzeit anstelle eines Datums wünschen, verwenden Sie ZonedDateTime class.

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

Über Java.time

Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die störenden alten Datum-Zeit-Klassen wie Java.util.Date , .Calendar , & Java.text.SimpleDateFormat .

Das Joda-Time - Projekt, jetzt im Wartungsmodus , empfiehlt die Migration zu den Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen.

Ein Großteil der Java.time - Funktionalität wird in ThreeTen-Backport auf Java 6 und Java 7 zurückportiert -/und außerdem an Android in ThreeTenABP angepasst (siehe Wie benutzt man… ).

Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen, wie zum Beispiel Interval , YearWeek , YearQuarter und more .

4
Basil Bourque

Year.now()

Es gibt eine einfachere Möglichkeit, die Java.time -Bibliothek in Java 8+ zu verwenden. Der Ausdruck:

Java.time.Year.now().getValue()

gibt das aktuelle Jahr als vierstelliges Int zurück, wobei Ihre Standardzeitzone verwendet wird. Es gibt viele Optionen für verschiedene Zeiten ZoneId s, Kalender s und hr s, aber ich denke, das ist es, was Sie am meisten wollen werden Zeit. Wenn Sie möchten, dass der Code sauberer aussieht (und keine anderen Java.time. *. Now () -Funktionen benötigt), geben Sie Folgendes ein:

import static Java.time.Year.now;

an der Spitze Ihrer Datei, und rufen Sie:

now().getValue()

wie benötigt.

1

Dieses Verhalten ist in der Dokumentation Java.util.Date -Klasse dokumentiert:

Gibt einen Wert zurück, der das Ergebnis der Subtraktion von 1900 vom Jahr ist das enthält oder beginnt mit dem Zeitpunkt, der durch diese dargestellt wird Datumsobjekt, wie in der lokalen Zeitzone interpretiert.

Es wird auch als veraltet markiert. Verwenden Sie stattdessen Java.util.Calendar .

1
esaj
        try{ 
int year = Integer.parseInt(new Date().toString().split("-")[0]); 
} 
catch(NumberFormatException e){
}

Ein großer Teil des Datums ist veraltet.

0
user287853