Domanda

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

È stato utile?

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 ) { 
 ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top