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.