Ottieni il valore intero dell'anno corrente in Java
Domanda
Devo determinare l'anno corrente in Java come numero intero. Potrei semplicemente usare java.util.Date ()
, ma è deprecato.
Soluzione
int year = Calendar.getInstance().get(Calendar.YEAR);
Non sei sicuro che ciò soddisfi i criteri per non impostare un nuovo calendario? (Perché l'opposizione a farlo?)
Altri suggerimenti
Usando l'API per l'ora di Java 8 (supponendo che tu sia felice di inserire l'anno nel fuso orario predefinito del tuo sistema), potresti usare il metodo Year :: now
:
int year = Year.now().getValue();
Il più semplice (usando Calendar, scusa) è:
int year = Calendar.getInstance().get(Calendar.YEAR);
Esiste anche la nuova API JSR di data e ora , nonché 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 vuoi l'anno di qualsiasi oggetto data, ho usato 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;
}
Puoi anche usare 2 metodi da java.time.YearMonth
(da Java 8):
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
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 a risolvere il problema critico del fuso orario nel determinare una data.
int year = LocalDate.now (). getYear ();
Tale codice dipende dal fuso orario predefinito corrente della JVM. La zona predefinita viene utilizzata per determinare la data di oggi. Ricorda, ad esempio, che nel momento dopo la mezzanotte a Parigi, la data di Montréal è ancora "ieri".
Quindi i tuoi risultati possono variare a seconda della macchina su cui gira, un utente / amministratore che modifica il fuso orario del sistema operativo host o qualsiasi codice Java in qualsiasi momento modificando l'attuale impostazione predefinita di JVM. Meglio specificare il fuso orario.
A proposito, usa sempre nomi corretti del fuso orario 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 obiettivo è 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 questi 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 fa un uso intensivo di 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 è ingombrante per l'aritmetica del datetime.
Puoi anche usare LocalDate di Java 8
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Come alcune persone hanno risposto sopra:
Se si desidera utilizzare la variabile in un secondo momento, utilizzare meglio:
int year;
year = Calendar.getInstance().get(Calendar.YEAR);
Se hai bisogno dell'anno solo per una condizione, è meglio che tu usi:
Calendar.getInstance().get(Calendar.YEAR)
Ad esempio usandolo in un attimo, mentre i controlli introdotti l'anno non sono inferiori all'anno corrente-200 o più dell'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 fare tutto usando la matematica Integer senza la necessità di creare un'istanza di un calendario:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Potrebbe essere spento per un'ora o due a Capodanno, ma non ho l'impressione che sia un problema?
Uso funzioni speciali nella mia libreria per lavorare con giorni / mese / anno ints -
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 ) {
...
}