Nein, java.util.Dateist nicht veraltet, nicht ab Java 8. Einige seiner Methoden sind veraltet, aber nicht die gesamte Klasse. Aber Sie sollten beide vermeiden java.util.Dateund java.util.Calendarda sie notorisch lästig, verwirrend und fehlerhaft sind. Verwenden Sie stattdessen entweder java.time (in Java 8) oder Joda-Time .
Basil Bourque
Antworten:
636
int year =Calendar.getInstance().get(Calendar.YEAR);
Sie sind sich nicht sicher, ob dies den Kriterien entspricht, keinen neuen Kalender einzurichten? (Warum die Opposition dagegen?)
Wenn Sie Ihre Antwort sehen, ist Kalender ein gutes Objekt. Ich suchte nach einem Einzeiler und dachte nicht, dass Calendar das für mich haben würde. Ich habe mich als falsch erwiesen! Vielen Dank!
Karlgrz
Was ist mit Parallelität, was ist, wenn andere Threads / Bibliothekscodes die aktuelle Zeit ändern? Wäre es nicht sinnvoll, es so zu ändern: Calendar c = Calendar.getInstance (); synchronisiert (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
jnr
1
Dies gibt in verschiedenen Android-Versionen einen anderen Wert zurück. Ich vergleiche Android v4.1.2 mit v4.2.1.
toobsco42
2
@ycnix Es gibt kein Problem mit der Parallelität des Codes, sodass es nicht erforderlich ist, ihn kompilierter zu gestalten. Calendar.getInstance().get(Calendar.YEAR) ist atomar in Bezug auf die Uhr, die extern geändert wird, und es synchronized(c)wäre hier sowieso sehr sinnlos, eine neue Instanz einer lokalen Variablen zu bearbeiten.
Nr.
5
import java.util.Calendar
Dominykas Mostauskis
139
Mit Java 8 Zeit API (vorausgesetzt , Sie sind glücklich , das Jahr in dem System der Standard - Zeitzone zu erhalten), Sie verwenden könnte die Year::nowMethode :
Ich empfehle, das optionale ZoneIdArgument immer an die nowaktuelle Standardzone der JVM zu übergeben, anstatt sich implizit darauf zu verlassen (dies kann sich jederzeit zur Laufzeit ändern!).
Basil Bourque
Was so aussieht int year = Year.now(ZoneId.of("America/New_York")).getValue();
Übrigens
25
Dies ist am einfachsten (mit Kalender, sorry) ist:
int year =Calendar.getInstance().get(Calendar.YEAR);
Dies gibt in verschiedenen Android-Versionen einen anderen Wert zurück. Ich vergleiche Android v4.1.2 mit v4.2.1.
toobsco42
1
@ toobsco42 - googeln Sie nach 'android calendar.year bug'
Toolkit
Hey @toolkit, ich habe ohne Glück recherchiert. Ich hatte auf eine genauere Antwort gehofft.
toobsco42
Ich habe meine SIM-Karte mit 4.1.2 aus dem Telefon entfernt. Daher konnte das Netzwerk Datum und Uhrzeit des Telefons nicht aktualisieren. Infolgedessen steckte das Telefon 2012 fest. Es sieht so aus, als wäre dies kein Fehler in 4.1.2.
toobsco42
14
Am einfachsten ist es, das Jahr aus dem Kalender abzurufen.
// year is stored as a static memberint year =Calendar.getInstance().get(Calendar.YEAR);
Calendar.YEAR ist wie folgt definiert ... public final static int YEAR = 1;
Cagcowboy
2
Die get () - API im Kalender ruft das Datum ab, das sich in dem durch die Konstante angegebenen Feld befindet. Das Jahr befindet sich im Feld 1 im Kalenderobjekt! Calendar.getInstance () ruft das aktuelle Datum ab. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Bob King
Dies gibt in verschiedenen Android-Versionen einen anderen Wert zurück. Ich vergleiche Android v4.1.2 mit v4.2.1.
toobsco42
Ich habe meine SIM-Karte mit 4.1.2 aus dem Telefon entfernt. Daher konnte das Netzwerk Datum und Uhrzeit des Telefons nicht aktualisieren. Infolgedessen steckte das Telefon 2012 fest. Es sieht so aus, als wäre dies kein Fehler in 4.1.2.
toobsco42
13
Sie können auch 2 Methoden aus java.time.YearMonth(Seit Java 8) verwenden:
import java.time.YearMonth;...int year =YearMonth.now().getYear();int month =YearMonth.now().getMonthValue();
Sie duplizieren fälschlicherweise eine andere Antwort, die vor langer Zeit veröffentlicht wurde. Und Sie produzieren einen Monat, der für die Frage irrelevant ist. Und Sie ignorieren das entscheidende Problem der Zeitzone. Und Ihre Formatierung ist chaotisch. Ich freue mich, dass Sie am Stack Overflow teilnehmen. Aber diese Antwort ist nicht gut genug. Bearbeiten Sie, um die Schwachstellen zu korrigieren und einen Mehrwert zu erzielen, der über den bereits in den anderen Antworten angegebenen Wert hinausgeht. Oder löschen Sie Ihre Antwort, bevor sie Abstimmungen sammelt. PS Super Avatar Symbol!
Basil Bourque
Vielen Dank Alter. Ich habe bearbeitet. Link ist ein bisschen anders als mein Weg
Zhurov Konstantin
10
Wenn Sie das Jahr eines Datumsobjekts möchten, habe ich die folgende Methode verwendet:
publicstaticint getYearFromDate(Date date){int result =-1;if(date !=null){Calendar cal =Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);}return result;}
Die Antwort von Raffi Khatchadourian zeigt mit Bedacht, wie das neue Paket java.time in Java 8 verwendet wird. Diese Antwort geht jedoch nicht auf das kritische Problem der Zeitzone bei der Bestimmung eines Datums ein.
int year = LocalDate.now (). getYear ();
Dieser Code hängt von der aktuellen Standardzeitzone der JVM ab. Die Standardzone wird verwendet, um das heutige Datum zu bestimmen. Denken Sie zum Beispiel daran, dass das Datum in Montréal nach Mitternacht in Paris immer noch „gestern“ ist.
Daher können Ihre Ergebnisse je nach dem Computer variieren, auf dem es ausgeführt wird, einem Benutzer / Administrator, der die Zeitzone des Host-Betriebssystems ändert, oder je nach Java-Code, der jederzeit die aktuelle Standardeinstellung der JVM ändert. Besser die Zeitzone angeben.
int year =ZonedDateTime.now(ZoneId.of("Africa/Casablanca")).getYear();
Joda-Zeit
Eine Idee wie oben, aber mit der Joda-Time 2.7-Bibliothek.
int year =DateTime.now(DateTimeZone.forID("Africa/Casablanca")).getYear();
Inkrementierendes / dekrementierendes Jahr
Wenn Sie ein Jahr nach dem anderen springen möchten, müssen Sie die Jahreszahl nicht extrahieren. Sowohl Joda-Time als auch java.time verfügen über Methoden zum Addieren / Subtrahieren eines Jahres. Und diese Methoden sind intelligent und behandeln die Sommerzeit und andere Anomalien.
@FBB Ich schlage die Wikipedia-Seite für die offizielle IANA-Liste der Zeitzonennamen vor. Achtung: Diese Zonen ändern sich überraschend oft. Wenn Sie wirklich Informationen wollen up-to-date, laden Sie eine neue Kopie von der tzdataDatendatei selbst. Sie können die Datei lesen. Und Sie können veraltete tzdata in Ihrer Java-Implementierung ersetzen. Oracle bietet ein Updater-Tool für seine JVM.
Basil Bourque
4
Wenn Ihre Anwendung Datums- und Kalenderobjekte stark nutzt, sollten Sie Joda Time wirklich verwenden, da dies java.util.Dateveränderbar ist. java.util.Calendarhat Leistungsprobleme, wenn seine Felder aktualisiert werden, und ist für die Datums- / Uhrzeitarithmetik umständlich.
Wenn Sie die Variable später verwenden möchten, verwenden Sie besser:
int year;
year =Calendar.getInstance().get(Calendar.YEAR);
Wenn Sie das Jahr nur für eine Bedingung benötigen, verwenden Sie besser:
Calendar.getInstance().get(Calendar.YEAR)
Zum Beispiel ist die Verwendung in einem Do, während das eingeführte Jahr nicht weniger als das aktuelle Jahr-200 oder mehr als das aktuelle Jahr ist (könnte das Geburtsjahr sein):
import java.util.Calendar;import java.util.Scanner;publicstaticvoid main (String[] args){Scanner scannernumber =newScanner(System.in);int year;/*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/do{System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
year = scannernumber.nextInt();}while(year <((Calendar.getInstance().get(Calendar.YEAR))-200)|| year >Calendar.getInstance().get(Calendar.YEAR));}
Diese Methode ist veraltet. Und diese schreckliche Klasse wurde vor Jahren durch die in JSR 310 definierten java.time- Klassen ersetzt. Siehe moderne Lösung in der Antwort von Assylias .
Basil Bourque
-1
In Java Version 8+ kann (empfohlen) die Bibliothek java.time verwendet werden. ISO 8601 legt die Standardmethode zum Schreiben von Daten fest: YYYY-MM-DDund java.time.Instantverwendet sie, also (für UTC):
java.util.Date
ist nicht veraltet, nicht ab Java 8. Einige seiner Methoden sind veraltet, aber nicht die gesamte Klasse. Aber Sie sollten beide vermeidenjava.util.Date
undjava.util.Calendar
da sie notorisch lästig, verwirrend und fehlerhaft sind. Verwenden Sie stattdessen entweder java.time (in Java 8) oder Joda-Time .Antworten:
Sie sind sich nicht sicher, ob dies den Kriterien entspricht, keinen neuen Kalender einzurichten? (Warum die Opposition dagegen?)
quelle
Calendar.getInstance().get(Calendar.YEAR)
ist atomar in Bezug auf die Uhr, die extern geändert wird, und essynchronized(c)
wäre hier sowieso sehr sinnlos, eine neue Instanz einer lokalen Variablen zu bearbeiten.import java.util.Calendar
Mit Java 8 Zeit API (vorausgesetzt , Sie sind glücklich , das Jahr in dem System der Standard - Zeitzone zu erhalten), Sie verwenden könnte die
Year::now
Methode :quelle
ZoneId
Argument immer an dienow
aktuelle Standardzone der JVM zu übergeben, anstatt sich implizit darauf zu verlassen (dies kann sich jederzeit zur Laufzeit ändern!).int year = Year.now(ZoneId.of("America/New_York")).getValue();
Dies ist am einfachsten (mit Kalender, sorry) ist:
Es gibt auch die neue Datums- und Zeit-API JSR sowie Joda Time
quelle
Am einfachsten ist es, das Jahr aus dem Kalender abzurufen.
quelle
Sie können auch 2 Methoden aus
java.time.YearMonth
(Seit Java 8) verwenden:quelle
Wenn Sie das Jahr eines Datumsobjekts möchten, habe ich die folgende Methode verwendet:
quelle
tl; dr
Zeitzone
Die Antwort von Raffi Khatchadourian zeigt mit Bedacht, wie das neue Paket java.time in Java 8 verwendet wird. Diese Antwort geht jedoch nicht auf das kritische Problem der Zeitzone bei der Bestimmung eines Datums ein.
Dieser Code hängt von der aktuellen Standardzeitzone der JVM ab. Die Standardzone wird verwendet, um das heutige Datum zu bestimmen. Denken Sie zum Beispiel daran, dass das Datum in Montréal nach Mitternacht in Paris immer noch „gestern“ ist.
Daher können Ihre Ergebnisse je nach dem Computer variieren, auf dem es ausgeführt wird, einem Benutzer / Administrator, der die Zeitzone des Host-Betriebssystems ändert, oder je nach Java-Code, der jederzeit die aktuelle Standardeinstellung der JVM ändert. Besser die Zeitzone angeben.
Verwenden Sie übrigens immer die richtigen Zeitzonennamen, wie sie von der IANA definiert wurden . Verwenden Sie niemals die 3-4 Buchstabencodes, die weder standardisiert noch eindeutig sind.
java.time
Beispiel in java.time von Java 8.
Joda-Zeit
Eine Idee wie oben, aber mit der Joda-Time 2.7-Bibliothek.
Inkrementierendes / dekrementierendes Jahr
Wenn Sie ein Jahr nach dem anderen springen möchten, müssen Sie die Jahreszahl nicht extrahieren. Sowohl Joda-Time als auch java.time verfügen über Methoden zum Addieren / Subtrahieren eines Jahres. Und diese Methoden sind intelligent und behandeln die Sommerzeit und andere Anomalien.
Beispiel in Joda-Zeit 2.7.
quelle
tzdata
Datendatei selbst. Sie können die Datei lesen. Und Sie können veraltete tzdata in Ihrer Java-Implementierung ersetzen. Oracle bietet ein Updater-Tool für seine JVM.Wenn Ihre Anwendung Datums- und Kalenderobjekte stark nutzt, sollten Sie Joda Time wirklich verwenden, da dies
java.util.Date
veränderbar ist.java.util.Calendar
hat Leistungsprobleme, wenn seine Felder aktualisiert werden, und ist für die Datums- / Uhrzeitarithmetik umständlich.quelle
Sie können auch Java 8 verwenden
LocalDate
:quelle
Wie einige Leute oben geantwortet haben:
Wenn Sie die Variable später verwenden möchten, verwenden Sie besser:
Wenn Sie das Jahr nur für eine Bedingung benötigen, verwenden Sie besser:
Zum Beispiel ist die Verwendung in einem Do, während das eingeführte Jahr nicht weniger als das aktuelle Jahr-200 oder mehr als das aktuelle Jahr ist (könnte das Geburtsjahr sein):
quelle
Verwenden Sie den folgenden Code für Java 8:
quelle
In meinem Fall funktioniert keines der oben genannten. Nachdem ich viele Lösungen ausprobiert hatte, fand ich unten eine und es funktionierte für mich
quelle
In Java Version 8+ kann (empfohlen) die Bibliothek java.time verwendet werden. ISO 8601 legt die Standardmethode zum Schreiben von Daten fest:
YYYY-MM-DD
undjava.time.Instant
verwendet sie, also (fürUTC
):PS nur für den Fall (und kurz für das Erhalten
String
, nichtint
),Calendar
sieht die Verwendung besser aus und kann zonenbewusst gemacht werden.quelle
Sie können das Ganze mit Integer-Mathematik ausführen, ohne einen Kalender instanziieren zu müssen:
Vielleicht zu Neujahr für ein oder zwei Stunden frei, aber ich habe nicht den Eindruck, dass dies ein Problem ist?
quelle
Ich benutze spezielle Funktionen in meiner Bibliothek, um mit Tagen / Monat / Jahr-Ints zu arbeiten -
quelle