Question

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

Était-ce utile?

La solution

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

Autres conseils

À l'aide de 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();

Le plus simple (avec Calendrier, pardon) est:

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

Il existe également la nouvelle API JSR Date et heure , ainsi que Heure Joda

Le moyen le plus simple consiste à extraire l'année du calendrier.

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

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

Vous pouvez également utiliser 2 méthodes de java.time.YearMonth (depuis 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()

Fuseau horaire

La réponse de Raffi Khatchadourian montre sagement comment utiliser le nouveau package java.time en Java 8. Mais cette réponse ne résout pas le problème critique du fuseau horaire lors de 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’au lendemain de minuit à Paris, 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 du système d'exploitation hôte ou de tout code Java à tout moment modifiant le paramètre par défaut de la JVM. Mieux vaut spécifier le fuseau horaire.

Au fait, utilisez toujours les 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 dans java.time 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 d'incrémentation / décrémentation

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, car elles traitent l’heure d’été et d’autres anomalies.

Exemple dans Joda-Time 2.7.

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

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

Vous pouvez également utiliser la LocalDate de Java 8. :

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

Comme certaines personnes ont répondu ci-dessus:

Si vous souhaitez utiliser la variable ultérieurement, utilisez plutôt:

int year;

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

Si vous avez besoin de l'année pour une condition, vous feriez mieux de 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));
}

Vous pouvez tout faire en utilisant Integer Math sans avoir besoin d'instancier un calendrier:

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);

Peut-être une heure ou deux au début de l'année, mais je n'ai pas l'impression que c'est un problème?

J'utilise des fonctions spéciales dans ma bibliothèque pour travailler avec les ints des jours / mois / années -

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 ) { 
 ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top