Ottieni il valore intero dell'anno corrente in Java


300

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


3
No, nonjava.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.Datejava.util.Calendar
— Basil Bourque,

Risposte:


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


1
Dopo aver visto la tua risposta, Calendar sarebbe un ottimo oggetto da usare. Ero alla ricerca di un one-liner e non pensavo che Calendar avrebbe avuto questo per me. Dimostrato che lo sono! Grazie!
— karlgrz,

Che dire della concorrenza, cosa succede se un altro thread / pezzo di codice della libreria cambia l'ora corrente? Non sarebbe ragionevole modificarlo in qualcosa del tipo: Calendar c = Calendar.getInstance (); sincronizzato (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
— jnr

1
Ciò restituisce un valore diverso in diverse versioni di Android. Sto confrontando Android v4.1.2 con v4.2.1.
— toobsco42,

2
@ycnix Non c'è alcun problema di concorrenza con il codice, quindi non è necessario renderlo più compilato. 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.
— nn.

5
import java.util.Calendar
— Dominykas Mostauskis,

139

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

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

7
Suggerisco di passare sempre l' ZoneIdargomento opzionale nowpiuttosto che fare affidamento implicito sull'attuale zona predefinita della JVM (che può cambiare in qualsiasi momento durante il runtime!).
— Basil Bourque,

Che sembra come questo BTW: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
— bcmoney

25

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


Ciò restituisce un valore diverso in diverse versioni di Android. Sto confrontando Android v4.1.2 con v4.2.1.
— toobsco42,

1
@ toobsco42 - prova a cercare su Google android calendar.year bug '
— toolkit

Ehi, @toolkit, ho fatto qualche ricerca senza fortuna. Speravo in una risposta più specifica.
— toobsco42,

Ho rimosso la mia carta SIM dal telefono con 4.1.2. Quindi la rete non è stata in grado di aggiornare la data e l'ora sul telefono. Di conseguenza, il telefono è stato bloccato nel 2012. Sembra che questo non sia un bug in 4.1.2.
— toobsco42,

14

Il modo più semplice è ottenere l'anno dal Calendario.

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

Calendar.YEAR non è l'anno corrente.
— toolkit,

Calendar.YEAR è definito in questo modo ... public final static int YEAR = 1;
— cagcowboy,

2
L'API get () sul calendario ottiene il dato che si trova nel campo specificato dalla costante. L'anno si trova nel campo 1 nell'oggetto Calendario! Calendar.getInstance () sta ottenendo la data corrente. java.sun.com/j2se/1.4.2/docs/api/java/util/…
— Bob King

Ciò restituisce un valore diverso in diverse versioni di Android. Sto confrontando Android v4.1.2 con v4.2.1.
— toobsco42,

Ho rimosso la mia carta SIM dal telefono con 4.1.2. Quindi la rete non è stata in grado di aggiornare la data e l'ora sul telefono. Di conseguenza, il telefono è stato bloccato nel 2012. Sembra che questo non sia un bug in 4.1.2.
— toobsco42,

12

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

Hai erroneamente duplicato un'altra risposta pubblicata molto tempo fa. E produci un mese irrilevante per la domanda. E ignori il problema cruciale del fuso orario. E la tua formattazione è disordinata. Sono felice di vederti partecipare a StackTranslate.it. Ma questa risposta non è abbastanza buona. Modifica per correggere i suoi punti deboli e aggiungere più valore oltre a quello già fornito dalle altre Risposte. Oppure elimina la tua risposta prima che raccolga voti negativi. Icona PS Super avatar!
— Basil Bourque,

Grazie mille amico. Ho modificato. il collegamento è un po 'diverso dal mio
— Zhurov Konstantin

10

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

il risultato è 1970!
— Dr. aNdRO,

10

tl; dr

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

Fuso orario

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.

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

2
Tutti gli ID di zona per i più pigri (come me): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
— FBB

1
@FBB Suggerisco la pagina di Wikipedia per l'elenco ufficiale IANA dei nomi dei fusi orari. Attenzione: queste zone cambiano sorprendentemente spesso. Se si vuole veramente informazioni up-to-date, scaricare una nuova copia del il tzdatafile 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.
— Basil Bourque,

4

Se l'applicazione sta facendo un uso intensivo di oggetti Date e Calendar, dovresti davvero usare Joda Time, perché java.util.Dateè mutabile. java.util.Calendarha problemi di prestazioni quando i suoi campi vengono aggiornati ed è ingombrante per l'aritmetica del datetime.



3

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

3

Utilizzare il seguente codice per Java 8:

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

0

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

    }

}

Tale metodo è obsoleto. E quella classe terribile è stata soppiantata anni fa dalle classi java.time definite in JSR 310. Vedi la soluzione moderna nella Risposta di assylias .
— Basil Bourque,

sì, ma stavo cercando attivamente una soluzione e ho provato molte soluzioni disponibili e per me questa ha funzionato così ho pubblicato :)
— Mayur Satav

-1

In Java versione 8+ è possibile (consigliato) utilizzare la libreria java.time . ISO 8601 imposta il modo standard per scrivere le date: YYYY-MM-DDe lo java.time.Instantusa, 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 Calendarsembra migliore e può essere reso consapevole delle zone.


Stai ignorando il problema cruciale del fuso orario. Vedi la soluzione più semplice in altra risposta .
— Basil Bourque,

-2

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?


9
stai lavorando per Apple, forse? macworld.com/article/2023580/…
— Stefan Paul Noack,

wow, questo è molto pesante, suggerirei di mantenerlo semplice come ha dimostrato Cagcowboy.
— LStrike,

Questo potrebbe non essere il migliore in tutte le circostanze, ma non merita downvotes.
— JohnnyLambada,

-4

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 ) { 
 ...
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.