Antworten:
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?)
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.
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 :
int year = Year.now().getValue();
ZoneId
Argument immer an die now
aktuelle Standardzone der JVM zu übergeben, anstatt sich implizit darauf zu verlassen (dies kann sich jederzeit zur Laufzeit ändern!).
Dies ist am einfachsten (mit Kalender, sorry) ist:
int year = Calendar.getInstance().get(Calendar.YEAR);
Es gibt auch die neue Datums- und Zeit-API JSR sowie Joda Time
Am einfachsten ist es, das Jahr aus dem Kalender abzurufen.
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
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();
Wenn Sie das Jahr eines Datumsobjekts möchten, habe ich die folgende Methode verwendet:
public static int getYearFromDate(Date date) {
int result = -1;
if (date != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);
}
return result;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
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.
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.
Beispiel in java.time von Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Eine Idee wie oben, aber mit der Joda-Time 2.7-Bibliothek.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
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.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
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.
Sie können auch Java 8 verwenden LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Wie einige Leute oben geantwortet haben:
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;
public static void main (String[] args){
Scanner scannernumber = new Scanner(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));
}
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
import java.util.Scanner;
import java.util.Date;
public class Practice
{
public static void main(String[] args)
{
Date d=new Date();
int year=d.getYear();
int currentYear=year+1900;
System.out.println(currentYear);
}
}
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
und java.time.Instant
verwendet sie, also (für UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS nur für den Fall (und kurz für das Erhalten String
, nicht int
), Calendar
sieht die Verwendung besser aus und kann zonenbewusst gemacht werden.
Sie können das Ganze mit Integer-Mathematik ausführen, ohne einen Kalender instanziieren zu müssen:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Vielleicht zu Neujahr für ein oder zwei Stunden frei, aber ich habe nicht den Eindruck, dass dies ein Problem ist?
Ich benutze spezielle Funktionen in meiner Bibliothek, um mit Tagen / Monat / Jahr-Ints zu arbeiten -
int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
return new int[] {
cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
};
};
int[] int_dmy( Date d ) {
...
}
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 .