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

300

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

karlgrz
la source
3
Non, java.util.Daten'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 deux java.util.Dateet java.util.Calendarcomme ils sont notoirement gênants, déroutants et imparfaits. Utilisez plutôt java.time (en Java 8) ou Joda-Time .
Basil Bourque

Réponses:

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

cagcowboy
la source
1
En voyant votre réponse, Calendrier serait un bel objet à utiliser. Je cherchais un monoplace et je ne pensais pas que Calendar l'aurait pour moi. Je me trompe! Merci!
karlgrz
Qu'en est-il de la concurrence, et si un autre thread / morceau de code de bibliothèque change l'heure actuelle? Ne serait-il pas raisonnable de le modifier en quelque chose comme: Calendar c = Calendar.getInstance (); synchronized (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
jnr
1
Cela renvoie une valeur différente dans différentes versions d'Android. Je compare Android v4.1.2 avec v4.2.1.
toobsco42
2
@ycnix Il n'y a pas de problème de concurrence avec le code, il n'est donc pas nécessaire de le rendre plus compilé. 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.
nos
5
import java.util.Calendar
Dominykas Mostauskis
139

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::nowméthode :

int year = Year.now().getValue();
assylias
la source
7
Je suggère de toujours passer l' ZoneIdargument facultatif nowplutô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!).
Basil Bourque
Ce qui ressemble à ce BTW: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney
25

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

boîte à outils
la source
Cela renvoie une valeur différente dans différentes versions d'Android. Je compare Android v4.1.2 avec v4.2.1.
toobsco42
1
@ toobsco42 - essayez de googler pour 'android calendar.year bug'
toolkit
Hé @toolkit, j'ai fait des recherches sans succès. J'espérais une réponse plus précise.
toobsco42
J'ai retiré ma carte SIM du téléphone avec 4.1.2. Le réseau n'a donc pas pu mettre à jour la date et l'heure sur le téléphone. Par conséquent, le téléphone a été bloqué en 2012. Il semble que ce ne soit pas un bug dans 4.1.2.
toobsco42
14

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);
conmulligan
la source
Calendar.YEAR n'est pas l'année en cours.
boîte à outils du
Calendar.YEAR est défini ainsi ... public final static int YEAR = 1;
cagcowboy
2
L'API get () sur Calendar obtient la donnée qui se trouve dans le champ spécifié par la constante. L'année est située dans le champ 1 de l'objet Calendrier! Calendar.getInstance () obtient la date actuelle. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Bob King le
Cela renvoie une valeur différente dans différentes versions d'Android. Je compare Android v4.1.2 avec v4.2.1.
toobsco42
J'ai retiré ma carte SIM du téléphone avec 4.1.2. Le réseau n'a donc pas pu mettre à jour la date et l'heure sur le téléphone. Par conséquent, le téléphone a été bloqué en 2012. Il semble que ce ne soit pas un bug dans 4.1.2.
toobsco42
12

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();
Zhurov Konstantin
la source
Vous dupliquez incorrectement une autre réponse publiée il y a longtemps. Et vous produisez un mois sans rapport avec la question. Et vous ignorez la question cruciale du fuseau horaire. Et votre formatage est désordonné. Je suis heureux de vous voir participer à Stack Overflow. Mais cette réponse n'est pas assez bonne. Modifier pour corriger ses faiblesses et ajouter plus de valeur au-delà de celle déjà fournie par les autres réponses. Ou supprimez votre réponse avant qu'elle ne recueille les votes négatifs. Icône PS Super avatar!
Basil Bourque
Merci beaucoup mec. J'ai édité. lien est un peu différent de ma façon
Zhurov Konstantin
10

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;
}
basZero
la source
le résultat est 1970!
Dr aNdRO
10

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 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.

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() ;

Incrémentation / décrémentation de l'année

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 ) ;
Basil Bourque
la source
2
Tous les ID de zone pour les paresseux (comme moi): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB
1
@FBB Je suggère la page Wikipedia pour la liste officielle des noms de fuseaux horaires de l' IANA . Attention: ces zones changent étonnamment souvent. Si vous voulez vraiment les informations mises à jour, télécharger une nouvelle copie de la tzdatafichier 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.
Basil Bourque
4

Si votre application fait un usage intensif des objets Date et Calendrier, vous devriez vraiment utiliser Joda Time, car il java.util.Dateest modifiable. java.util.Calendara des problèmes de performances lorsque ses champs sont mis à jour et est maladroit pour l'arithmétique datetime.

Alan
la source
3

Vous pouvez également utiliser Java 8 LocalDate:

import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Raffi Khatchadourian
la source
1
@ AndrewT., Obtenez le backport ThreeTen et cela fonctionnera aussi en Java 6 et 7.
Ole VV
3

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));
}
maral04
la source
3

Utilisez le code suivant pour java 8:

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

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

    }

}
Mayur Satav
la source
Cette méthode est obsolète. Et cette classe terrible a été remplacée il y a des années par les classes java.time définies dans JSR 310. Voir la solution moderne dans la réponse de assylias .
Basil Bourque
ouais mais je cherchais activement une solution et j'ai essayé beaucoup de solutions disponibles et pour moi celle-ci a fonctionné alors j'ai posté :)
Mayur Satav
-1

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-DDet l' java.time.Instantutilise, 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 Calendarsemble meilleure et peut être rendue sensible à la zone.

Alexei Martianov
la source
Vous ignorez la question cruciale du fuseau horaire. Voir une solution plus simple dans une autre réponse .
Basil Bourque
-2

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?

Ewan Makepeace
la source
9
travaillez-vous pour apple, peut-être? macworld.com/article/2023580/…
Stefan Paul Noack
wow, c'est très lourd, je suggérerais de rester simple comme l'a montré cagcowboy.
LStrike
Ce n'est peut-être pas le meilleur en toutes circonstances, mais cela ne mérite pas de votes négatifs.
JohnnyLambada
-4

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