Réponses:
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?)
Calendar.getInstance().get(Calendar.YEAR)
est atomique en ce qui concerne l'horloge étant changée en externe, et faire synchronized(c)
sur une nouvelle instance d'une variable locale serait de toute façon très inutile ici.
import java.util.Calendar
En utilisant l'API de temps de Java 8 (en supposant que vous êtes heureux d'obtenir l'année dans le fuseau horaire par défaut de votre système), vous pouvez utiliser la Year::now
méthode :
int year = Year.now().getValue();
ZoneId
argument facultatif now
plutôt que de s'appuyer implicitement sur la zone par défaut actuelle de la JVM (qui peut changer à tout moment pendant l'exécution!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
Le plus simple (en utilisant Calendrier, désolé) est:
int year = Calendar.getInstance().get(Calendar.YEAR);
Il y a aussi la nouvelle API Date et Heure JSR , 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);
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();
Si vous voulez l'année de n'importe quel objet 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 de Raffi Khatchadourian montre judicieusement 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 par défaut actuel de la JVM. La zone par défaut est utilisée pour déterminer la date du jour. Rappelez-vous, par exemple, que peu après minuit à Paris, la date à Montréal est toujours «hier».
Vos résultats peuvent donc varier selon la machine sur laquelle il s'exécute, un utilisateur / administrateur modifiant le fuseau horaire du système d'exploitation hôte ou tout code Java à tout moment modifiant la valeur par défaut actuelle de la JVM. Mieux vaut spécifier le fuseau horaire.
Soit dit en passant, utilisez toujours les noms de fuseau horaire appropriés tels que définis par l'IANA . N'utilisez jamais les codes à 3 ou 4 lettres qui ne sont ni standardisés ni uniques.
Exemple dans java.time 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 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 ajouter / soustraire une année à la fois. Et ces méthodes sont intelligentes, gérant l'heure d'été et d'autres anomalies.
Exemple dans java.time .
ZonedDateTime zdt =
ZonedDateTime
.now( ZoneId.of( "Africa/Casablanca" ) )
.minusYears( 1 )
;
Exemple dans Joda-Time 2.7.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
tzdata
fichier de données vous. Vous pouvez parcourir le fichier. Et vous pouvez remplacer un tzdata obsolète dans votre implémentation Java. Oracle fournit un outil de mise à jour pour leur JVM.
Vous pouvez également utiliser Java 8 LocalDate
:
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, mieux vaut:
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 des chèques introduits n'est pas inférieure à l'année en cours-200 ou supérieure à l'année en cours (pourrait être l'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));
}
Dans mon cas, rien de ce qui précède ne fonctionne. Donc, après avoir essayé beaucoup de solutions, j'ai trouvé ci-dessous une et cela a fonctionné pour moi
import java.util.Scanner;
import java.util.Date;
public class Practice
{
public static void main(String[] args)
{
Date d=new Date();
int year=d.getYear();
int currentYear=year+1900;
System.out.println(currentYear);
}
}
En Java, la version 8+ peut (conseillée) utiliser la bibliothèque java.time . ISO 8601 définit la manière standard d'écrire les dates: YYYY-MM-DD
et l' java.time.Instant
utilise, donc (pour UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS juste au cas où (et abrégé pour obtenir String
, non int
), l'utilisation Calendar
semble meilleure et peut être rendue sensible à la zone.
Vous pouvez tout faire en utilisant les mathématiques entières sans avoir à instancier un calendrier:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Peut être absent pendant 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 entrées 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 ) {
...
}
java.util.Date
n'est pas obsolète, pas depuis Java 8. Certaines de ses méthodes sont obsolètes mais pas la classe entière. Mais vous devez éviter les deuxjava.util.Date
etjava.util.Calendar
comme ils sont notoirement gênants, déroutants et imparfaits. Utilisez plutôt java.time (en Java 8) ou Joda-Time .