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.
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?)
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();
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
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);
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;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
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.
Exemple en Java.heure de Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
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() ;
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 ) ;
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.
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));
}
Vous pouvez également utiliser Java 8 LocalDate
:
import Java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Utilisez le code suivant pour Java 8:
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();