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

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

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

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

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

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

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

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

Il y a aussi les nouvelles API JSR Date et Heure , ainsi que Joda Time

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

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

Si vous voulez l’année de n’importe quel object 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; } 

tl; dr

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

Fuseau horaire

La réponse de Raffi Khatchadourian montre judicieusement 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 dans la détermination d’une date.

int année = LocalDate.now (). getYear ();

Ce code dépend du fuseau horaire par défaut de la JVM. La zone par défaut est utilisée pour déterminer la date du jour. Rappelez-vous, par exemple, qu’au moment de minuit à Paris, la date à Montréal est encore “hier”.

Ainsi, vos résultats peuvent 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 modifiant à tout moment la valeur par défaut actuelle de la JVM. Mieux vaut spécifier le fuseau horaire.

À propos, utilisez toujours les noms de fuseaux horaires définis 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 objective est de sauter une année à la fois, pas besoin d’extraire le numéro de l’année. Joda-Time et java.time ont tous deux des méthodes pour append / soustraire une année à la fois. Et ces méthodes sont intelligentes, en gérant 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 objects Date et Calendar, vous devriez 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 maladroit pour l’arithmétique datetime.

Comme certaines personnes ont répondu ci-dessus:

Si vous souhaitez utiliser la variable ultérieurement, mieux vaut utiliser:

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

Si vous avez besoin de l’année pour une condition que vous utilisez mieux:

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

Par exemple, l’utiliser dans un do alors que l’année de vérification n’est pas inférieure à l’année 200 ou plus que l’année en cours (cela pourrait être l’année de naissance):

 import java.util.Calendar; import java.util.Scanner; public static void main (Ssortingng[] 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 également utiliser LocalDate Java 8:

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

Vous pouvez également utiliser 2 méthodes depuis java.time.YearMonth (depuis Java 8):

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

Vous pouvez faire tout le travail en utilisant des mathématiques entières sans avoir à instancier un calendrier:

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

Peut-être pour une heure ou deux au nouvel an 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 des jours / mois / année –

 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 ) { ... }