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?)
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 :
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!).
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 memberint year =Calendar.getInstance().get(Calendar.YEAR);
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();
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:
publicstaticint getYearFromDate(Date date){int result =-1;if(date !=null){Calendar cal =Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);}return result;}
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.
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.
@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.
@ 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;publicstaticvoid main (String[] args){Scanner scannernumber =newScanner(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
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):
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 .Réponses:
Vous ne savez pas si cela répond aux critères de non-configuration d'un nouveau calendrier? (Pourquoi l'opposition à le faire?)
la source
Calendar.getInstance().get(Calendar.YEAR)
est atomique en ce qui concerne l'horloge étant changée en externe, et fairesynchronized(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 :la source
ZoneId
argument facultatifnow
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:
Il y a aussi la nouvelle API Date et Heure JSR , ainsi que Joda Time
la source
Le moyen le plus simple est d'obtenir l'année à partir du calendrier.
la source
Vous pouvez également utiliser 2 méthodes depuis
java.time.YearMonth
(Depuis Java 8):la source
Si vous voulez l'année de n'importe quel objet date, j'ai utilisé la méthode suivante:
la source
tl; dr
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.
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.
Joda-Time
Une idée comme ci-dessus, mais en utilisant la bibliothèque Joda-Time 2.7.
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 .
Exemple dans Joda-Time 2.7.
la source
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.Si votre application fait un usage intensif des objets Date et Calendrier, vous devriez vraiment utiliser Joda Time, car il
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.la source
Vous pouvez également utiliser Java 8
LocalDate
:la source
Comme certaines personnes ont répondu ci-dessus:
Si vous souhaitez utiliser la variable ultérieurement, mieux vaut:
Si vous avez besoin de l'année pour une condition que vous utilisez mieux:
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):
la source
Utilisez le code suivant pour java 8:
la source
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
la source
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 (pourUTC
):PS juste au cas où (et abrégé pour obtenir
String
, nonint
), l'utilisationCalendar
semble meilleure et peut être rendue sensible à la zone.la source
Vous pouvez tout faire en utilisant les mathématiques entières sans avoir à instancier un calendrier:
Peut être absent pendant une heure ou deux au nouvel an mais je n'ai pas l'impression que c'est un problème?
la source
J'utilise des fonctions spéciales dans ma bibliothèque pour travailler avec des entrées jours / mois / année -
la source