Risposte:
int year = Calendar.getInstance().get(Calendar.YEAR);
Non sei sicuro che questo soddisfi i criteri per non impostare un nuovo calendario? (Perché l'opposizione a farlo?)
Calendar.getInstance().get(Calendar.YEAR)
è atomico riguardo al fatto che l'orologio viene cambiato esternamente, e fare synchronized(c)
su una nuova istanza di una variabile locale sarebbe comunque molto inutile qui.
import java.util.Calendar
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), puoi usare il Year::now
metodo :
int year = Year.now().getValue();
ZoneId
argomento opzionale now
piuttosto che fare affidamento implicito sull'attuale zona predefinita della JVM (che può cambiare in qualsiasi momento durante il runtime!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
Il più semplice (usando Calendar, scusa) è:
int year = Calendar.getInstance().get(Calendar.YEAR);
C'è anche la nuova API JSR per 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);
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();
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;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
La risposta di Raffi Khatchadourian mostra saggiamente come utilizzare 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, per esempio, che nel momento dopo la mezzanotte a Parigi, la data a Montréal è ancora "ieri".
Pertanto, i risultati possono variare in base alla macchina su cui viene eseguita, a un utente / amministratore che modifica il fuso orario del sistema operativo host o qualsiasi codice Java in qualsiasi momento, modificando l'attuale impostazione predefinita della JVM. Meglio specificare il fuso orario.
A proposito, utilizzare sempre i nomi dei fusi orari corretti, come definito dalla IANA . Non usare mai i codici di 3-4 lettere che non sono né standardizzati né unici.
Esempio in java.time di Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Qualche idea come sopra, ma usando la libreria Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
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 java.time .
ZonedDateTime zdt =
ZonedDateTime
.now( ZoneId.of( "Africa/Casablanca" ) )
.minusYears( 1 )
;
Esempio in Joda-Time 2.7.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
tzdata
file di dati da soli. È possibile esaminare il file. E puoi sostituire un tzdata obsoleto nella tua implementazione Java. Oracle fornisce uno strumento di aggiornamento per la loro JVM.
Puoi anche usare Java 8 LocalDate
:
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 che è meglio usare:
Calendar.getInstance().get(Calendar.YEAR)
Ad esempio, usandolo in una do, 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));
}
Nel mio caso nessuno dei precedenti ha funzionato. Quindi, dopo aver provato molte soluzioni, ne ho trovato una sotto e ha funzionato per me
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 versione 8+ è possibile (consigliato) utilizzare la libreria java.time . ISO 8601 imposta il modo standard per scrivere le date: YYYY-MM-DD
e lo java.time.Instant
usa, quindi (per UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS per ogni evenienza (e abbreviato per ottenere String
, non int
), l'utilizzo Calendar
sembra migliore e può essere reso consapevole delle zone.
Puoi fare tutto usando la matematica di Integer senza dover 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 ) {
...
}
java.util.Date
è deprecato, non a partire da Java 8. Alcuni dei suoi metodi sono deprecati ma non l'intera classe. Ma dovresti evitare entrambi e poiché sono notoriamente fastidiosi, confusi e imperfetti. Utilizzare invece java.time (in Java 8) o Joda-Time .java.util.Date
java.util.Calendar