Ottieni il valore intero dell’anno corrente in Java

Devo determinare l’anno corrente in Java come numero intero. Potrei semplicemente usare java.util.Date() , ma è deprecato.

 int year = Calendar.getInstance().get(Calendar.YEAR); 

Non sei sicuro se questo soddisfa i criteri di non impostare un nuovo calendario? (Perché l’opposizione a farlo?)

Utilizzando l’API di tempo di Java 8 (supponendo che tu sia felice di ottenere l’anno nel fuso orario predefinito del tuo sistema), puoi utilizzare il metodo Year::now :

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

Questo più semplice (usando Calendar, sorry) è:

  int year = Calendar.getInstance().get(Calendar.YEAR); 

C’è anche il nuovo JSR dell’API Date and Time e anche Joda Time

Il modo più semplice è ottenere l’anno dal calendario.

 // year is stored as a static member int year = Calendar.getInstance().get(Calendar.YEAR); 

Se si desidera l’anno di qualsiasi object data, ho utilizzato il seguente metodo:

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

tl; dr

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

Fuso orario

La risposta di Raffi Khatchadourian mostra saggiamente come usare il nuovo pacchetto java.time in Java 8. Ma quella risposta non riesce ad affrontare il problema critico del fuso orario nel determinare una data.

int year = LocalDate.now (). getYear ();

Questo codice dipende dal fuso orario predefinito della JVM. La zona predefinita viene utilizzata per determinare la data odierna. Ricorda, per esempio, che nel momento dopo la mezzanotte a Parigi, la data a Montréal è ancora “ieri”.

Quindi i risultati possono variare a seconda del computer su cui viene eseguito, di un utente / amministratore che modifica il fuso orario del sistema operativo host o di qualsiasi codice Java in qualsiasi momento modificando l’impostazione predefinita della JVM. Meglio specificare il fuso orario.

A proposito, usa sempre i nomi dei fusi orari appropriati come definito dalla IANA . Non utilizzare mai i codici di 3-4 lettere che non sono né standardizzati né unici.

java.time

Esempio in java.time di Java 8.

 int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ; 

Joda-Time

Qualche idea come sopra, ma usando la libreria Joda-Time 2.7.

 int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ; 

Anno di incremento / decremento

Se il tuo objective è saltare un anno alla volta, non è necessario estrarre il numero dell’anno. Sia Joda-Time che java.time hanno metodi per aggiungere / sottrarre un anno alla volta. E quei metodi sono intelligenti, gestiscono l’ora legale e altre anomalie.

Esempio in Joda-Time 2.7.

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

Se la tua applicazione sta facendo un uso massiccio degli oggetti Date e Calendar, dovresti davvero usare Joda Time, perché java.util.Date è mutabile. java.util.Calendar ha problemi di prestazioni quando i suoi campi vengono aggiornati, ed è goffo per l’aritmetica datetime.

Come alcune persone hanno risposto sopra:

Se vuoi usare la variabile in un secondo momento, usa meglio:

 int year; year = Calendar.getInstance().get(Calendar.YEAR); 

Se hai bisogno di un anno solo per una condizione, usa meglio:

 Calendar.getInstance().get(Calendar.YEAR) 

Ad esempio, utilizzarlo in un do while che controlla l’anno introdotto non è inferiore all’attuale anno-200 o superiore all’anno corrente (potrebbe essere l’anno di nascita):

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

Puoi anche utilizzare LocalDate Java 8:

 import java.time.LocalDate; //... int year = LocalDate.now().getYear(); 

Puoi anche utilizzare 2 metodi da java.time.YearMonth (Since Java 8):

 import java.time.YearMonth; ... int year = YearMonth.now().getYear(); int month = YearMonth.now().getMonthValue(); 

Puoi fare tutto usando la matematica Integer senza dover creare un’istanza di un calendario:

 return (System.currentTimeMillis()/1000/3600/24/365.25 +1970); 

Può essere spento per un’ora o due al nuovo anno ma non ho l’impressione che sia un problema?

Uso funzioni speciali nella mia libreria per lavorare con giorni / mese / anno inte

 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 ) { ... }