web-dev-qa-db-fra.com

Obtenir la valeur entière de l'année en cours dans Java

Je dois déterminer l'année en cours dans Java sous forme d'entier. Je pourrais simplement utiliser Java.util.Date(), mais c'est obsolète.

269
karlgrz
int year = Calendar.getInstance().get(Calendar.YEAR);

Vous ne savez pas si cela répond aux critères de non-configuration d'un nouveau calendrier? (Pourquoi l'opposition à le faire?)

576
cagcowboy

En utilisant l'API de temps de Java 8 (en supposant que vous souhaitiez que l'année soit dans le fuseau horaire par défaut de votre système), vous pouvez utiliser la méthode Year::now _ :

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

Ce plus simple (en utilisant Calendrier, désolé) est:

 int year = Calendar.getInstance().get(Calendar.YEAR);

Il y a aussi le nouveau Date et heure API JSR , ainsi que Joda Time

25
toolkit

Le moyen le plus simple est d’obtenir l’année du calendrier.

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

Vous pouvez également utiliser deux méthodes de Java.time.YearMonth (Depuis Java 8):

import Java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();

Si vous voulez l'année d'un objet de date, j'ai utilisé la méthode suivante:

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

tl; dr

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

Fuseau horaire

La réponse par Raffi Khatchadourian montre comment utiliser le nouveau package Java.time dans Java 8. Mais cette réponse ne parvient pas à résoudre le problème critique du fuseau horaire dans la détermination d'une date.

int year = LocalDate.now (). getYear ();

Ce code dépend du fuseau horaire actuel par défaut de la machine virtuelle Java. La zone par défaut est utilisée pour déterminer la date du jour. Rappelez-vous, par exemple, qu’après Paris, après minuit, la date à Montréal est toujours "hier".

Vos résultats peuvent donc varier en fonction de la machine sur laquelle il s'exécute, d'un utilisateur/administrateur modifiant le fuseau horaire de l'OS hôte ou de tout code Java à tout moment changer la valeur par défaut de la machine virtuelle Java. Mieux vaut spécifier le fuseau horaire.

Par ailleurs, utilisez toujours noms de fuseau horaire appropriés comme défini par l'IANA . N'utilisez jamais les codes de 3-4 lettres qui ne sont ni normalisés ni uniques.

Java.time

Exemple en Java.heure de Java 8.

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

Joda-Time

Une idée comme ci-dessus, mais en utilisant la bibliothèque Joda-Time 2.7.

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

Année incrémentante/décrémentante

Si votre objectif est de sauter d'une année à la fois, inutile d'extraire le numéro de l'année. Joda-Time et Java.time ont tous deux des méthodes pour ajouter/soustraire une année à la fois. Et ces méthodes sont intelligentes, traitant l’heure d’été et d’autres anomalies.

Exemple dans Joda-Time 2.7.

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
8
Basil Bourque

Si votre application utilise beaucoup les objets Date et Calendrier, vous devez vraiment utiliser Joda Time, car Java.util.Date est mutable. Java.util.Calendar a des problèmes de performances lorsque ses champs sont mis à jour et est peu pratique pour l'arithmétique datetime.

4
Alan

Comme certaines personnes ont répondu ci-dessus:

Si vous voulez utiliser la variable plus tard, mieux vaut utiliser:

int year;

year = Calendar.getInstance().get(Calendar.YEAR);

Si vous avez besoin de l'année pour une condition, il vaut mieux l'utiliser:

Calendar.getInstance().get(Calendar.YEAR)

Par exemple, si vous l'utilisez dans un do alors que l'année de contrôle des chèques n'est pas inférieure à l'année en cours - 200 ou supérieure à l'année en cours (peut être une année de naissance):

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
maral04

Vous pouvez également utiliser Java 8 LocalDate :

import Java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
3

Utilisez le code suivant pour Java 8:

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