Holen Sie sich den Ganzzahlwert des aktuellen Jahres in Java


300

Ich muss das aktuelle Jahr in Java als Ganzzahl bestimmen. Ich könnte nur verwenden java.util.Date(), aber es ist veraltet.


3
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?)


1
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 :

int year = Year.now().getValue();

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

Es gibt auch die neue Datums- und Zeit-API JSR sowie Joda Time


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 member
int year = Calendar.getInstance().get(Calendar.YEAR);

Calendar.YEAR ist nicht das aktuelle Jahr.
Toolkit

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:

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;
}

Ergebnis ist 1970!
Dr. aNdRO

10

tl; dr

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

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.

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.

java.time

Beispiel in java.time von Java 8.

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.

Beispiel in Joda-Zeit 2.7.

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;

2
Alle Zonen-IDs für die Faulen (wie ich): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@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.



3

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));
}

3

Verwenden Sie den folgenden Code für Java 8:

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();

0

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

    }

}

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):

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), Calendarsieht die Verwendung besser aus und kann zonenbewusst gemacht werden.


Sie ignorieren das entscheidende Problem der Zeitzone. Siehe einfachere Lösung in anderer Antwort .
Basil Bourque

-2

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?


9
arbeitest du vielleicht für apple? macworld.com/article/2023580/…
Stefan Paul Noack

Wow, das ist sehr schwer, ich würde vorschlagen, es einfach zu halten, wie es Cagcowboy gezeigt hat.
LStrike

Dies ist möglicherweise nicht unter allen Umständen die beste, verdient jedoch keine Ablehnung.
Johnny Lambada

-4

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 ) { 
 ...
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.