java.util.Date et getYear()
Je rencontre le problème suivant en Java (je vois certaines personnes ont de la
un problème similaire en JavaScript mais je suis en utilisant Java)
System.out.println(new Date().getYear());
System.out.println(new GregorianCalendar().getTime().getYear());
System.out.println(this.sale.getSaleDate().getYear());
System.out.println(this.sale.getSaleDate().getMonth());
System.out.println(this.sale.getSaleDate().getDate());
retourne
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 1
I/System.out( 4274): 11
Je ne comprends pas le 112 bits qui à mon avis aurait été 2012.
Ce qui se passe? Est le
java.util.Date
classe inutilisable? Je suis le stockage comme un champ dans plusieurs
de mes cours de stocker une date et une heure. Que dois-je faire?
- chers OP, c'est parce que dans la classe il soustrait 1900 afin d'obtenir l'année pls ajouter 1900 à elle ..source-fichier java(
@Deprecated public int getYear() { return normalize().getYear() - 1900; }
)
Vous devez vous connecter pour publier un commentaire.
Selon la documentation javadoc:
Obsolète. de la version de JDK 1.1, remplacé par
Calendar.get(Calendar.YEAR) - 1900
.Renvoie une valeur qui est le résultat de la soustraction de 1900 à partir de l'année qui contient ou commence à l'instant dans le temps représenté par cet objet Date, conformément à l'interprétation dans le fuseau horaire local.
Retourne:
l'année a représenté à cette date, à moins de 1900.
Voir Aussi:
Calendrier
De sorte que le 112 est le bon de sortie. Je suivrais les conseils dans la Javadoc ou de l'utilisation JodaTime à la place.
En plus de tous les commentaires, j'ai pensé que je pourrais ajouter un peu de code sur la façon d'utiliser java.util.Date, java.util.Calendrier et java.util.GregorianCalendar selon la javadoc.
Utiliser le format de date
Ne pas utiliser
Date
, utilisezCalendar
:Il prend en charge le temps:
Yup, c'est en fait ce qui se passe. Voir aussi la Javadoc:
La getYear méthode est déconseillée pour cette raison. Donc, ne l'utilisez pas.
Note également que la méthode getMonth renvoie un nombre entre 0 et 11. Par conséquent,
this.sale.getSaleDate().getMonth()
retourne 1 pour le mois de février, au lieu de 2. Alors quejava.util.Calendar
ne pas ajouter de 1900 à toutes les années, il ne souffre de la morte-par-un-mois problème.Vous êtes beaucoup mieux à l'aide de JodaTime.
La documentation de java suggère de faire usage de l'Agenda de la classe au lieu de cette façon obsolète
Voici un exemple de code pour définir le calendrier de l'objet
Voici un exemple de code pour obtenir l'année, le mois, etc.
Calendrier dispose également d'un support pour de nombreuses autres informations utiles, comme, TEMPS, DAY_OF_MONTH, etc. Ici le la documentation liste de tous d'entre eux
Veuillez noter que les mois sont de 0 basée. Janvier est 0e mois.
java.util.Date
,java.util.Calendar
, etjava.text.SimpleDateFormat
sont maintenant héritage, supplantée par la java.de temps les classes intégré dans Java 8 & Java 9. Voir Tutoriel par Oracle.Java 8 LocalDate classe est une autre option pour obtenir l'année de java.util.Date,
Une autre option est,
SimpleDateFormat
avec le moderne java.temps classes? Utiliser lesDateTimeFormatter
, la classe qui remplace complètementSimpleDateFormat
.tl;dr
java.temps
À la fois la
java.util.Date
etjava.util.Calendar
classes sont l'héritage, aujourd'hui supplanté par le java.temps cadre intégré dans Java 8 et les versions ultérieures.Un fuseau horaire est crucial dans la détermination d'une date. Pour un moment donné, la date varie à travers le monde par zone. Par exemple, quelques minutes après minuit dans Paris, France est un nouveau jour, alors encore “hier” dans Montréal, Québec.
Si pas de temps horaire est spécifié, la JVM s'applique implicitement son actuel fuseau horaire par défaut. Par défaut peuvent être modifiés à tout moment, pour vos résultats peuvent varier. Mieux préciser votre choix/l'heure prévue de la zone explicitement comme un argument.
Spécifier un fuseau horaire nom dans le format de
continent/region
, commeAmerica/Montreal
,Africa/Casablanca
, ouPacific/Auckland
. Ne jamais utiliser de l'3-4 abréviation commeEST
ouIST
comme ils sont pas vrai fuseaux horaires, pas normalisée, et même pas unique(!).Si vous voulez que la date sans l'heure de la journée, utilisez
LocalDate
. Cette classe manque de temps de la zone d'informations, mais vous pouvez spécifier un fuseau horaire à déterminer la date actuelle.Vous pouvez obtenir les différents éléments d'information avec
getYear
,getMonth
, etgetDayOfMonth
. Vous réellement obtenir le numéro de l'année avec java.temps de!Si vous voulez une date-heure, au lieu d'une date, utilisez
ZonedDateTime
classe.Sur java.temps
La java.le temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieille date-heure classes telles que
java.util.Date
,.Agenda
, &java.texte.SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications.
Une grande partie de la java.temps fonctionnalité est porté à Java 6 & Java 7 en ThreeTen-Backport et plus adapté à Android dans ThreeTenABP (voir Comment l'utiliser...).
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.Ce comportement est documenté dans le java.util.Date -documentation de classe:
Il est également marqué comme obsolète. Utilisation java.util.Calendrier à la place.
Year.now()
Il y a un moyen plus simple d'utiliser la java.le temps bibliothèque en Java 8+. L'expression:
renvoie l'année à quatre chiffres, int, à l'aide de votre fuseau horaire par défaut. Il ya beaucoup d'options pour les différents temps ZoneIds, Calendriers et Horloges, mais je pense que c'est ce que vous voulez la plupart du temps. Si vous voulez le code plus propre (et n'ont pas besoin de toute autre java.temps.*.now (), fonctions), mettre:
en haut de votre fichier, et de l'appeler:
en tant que de besoin.
Beaucoup de Date est obsolète.