Pourquoi Java est à Jour.getYear() return 111 au lieu de 2011?
Je vais avoir un peu de difficulté de l'analyse d'une chaîne de date pour un Date
objet. J'utilise un DateFormat
pour analyser la chaîne, et lorsque j'imprime la valeur de la date, il me donne ce que j'attends.
Mais quand j'ai essayer de faire le jour, le mois ou l'année, il me donne des valeurs erronées. Par exemple, l'année 2011 est, mais quand je fais .getYear()
il me donne 111. Je n'ai aucune idée de pourquoi cela se passe. Ici est le segment de code:
Date dateFrom = null;
String gDFString = g.getDateFrom();
System.out.println(gDFString);
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
dateFrom = df.parse("04/12/2011");
System.out.println(dateFrom);
System.out.println(dateFrom.getYear());
} catch (ParseException e) {
e.printStackTrace();
}
Quand j'ai l'impression dateFrom
, je reçois Sun Dec 04 00:00:00 GMT 2011
, qui est ce que vous attendez. Mais l'impression .getYear()
retourne 111
.
J'ai besoin d'être en mesure d'obtenir le jour, le mois et l'année de la date pour un graphique de la série chronologique.
- Il n'a même pas une fois s'est produite à vous de lire la documentation du [Date.getYear()](download.oracle.com/javase/6/docs/api/java/util/... qui indique clairement qu'il renvoie “l'année a représenté à cette date, à moins de 1900“?
- Beaucoup de programmeurs (dont moi) attendre l'année 2011 pour être analysé comme en 2011, pas 2011 - 1900, pour sûr. je pense que c'est de Java mise en œuvre, ce qui est étrange, à n'importe quelles raisons internes sont derrière elle), pas de l'OP.
Vous devez vous connecter pour publier un commentaire.
Ces méthodes ont été obsolète. Au lieu de cela, utilisez la Calendrier classe.
Sortie:
Et comme pour les mois champ, c'est basé sur 0. Cela signifie que janvier = 0 et décembre = 11. Comme l'a déclaré le javadoc,
Javadoc à la rescousse:
Vous ne devriez pas utiliser des méthodes obsolètes. Des méthodes obsolètes sont des méthodes qui ne doivent pas être utilisés plus. Mais quelle que soit la méthode que vous utilisez, de lire ses javadoc pour savoir ce qu'il fait.
Président du Mal réussi,
Date.getYear()
renvoie une valeur qui est le résultat de la soustraction de 1900 à partir de l'année qui contient. Et vous vous ne devriez pas l'utiliser.Mais quick fix pour le code en question est:
Ce n'est qu'une supposition, mais la 111 pourrait être le nombre d'années depuis 1900. Jetez un oeil à la documentation/faire quelques tests pour vérifier cela (je ne peux pas vérifier pour le moment)
http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#getYear%28%29
La spécification stipule qu'il revient l'année, moins de 1900. Probablement une bonne idée pour éviter de méthodes obsolètes ainsi.
tl;dr
java.temps
Le gênants
java.util.Date
de la classe et de ses frères et sœurs sont aujourd'hui supplanté par l'excellent java.les classes de temps.La java.les classes de temps utiliser sane numérotation, avec:
Interroger le
LocalDate
pour ses parties constituantes.Vous pouvez même demander automatiquement localisée nom du mois et le nom des jours de la semaine.
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
,.Calendar
, &java.text.SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers java.temps.
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.fonction temps est de retour, porté à Java 6 & 7 dans 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
Interval
,YearWeek
,YearQuarter
, et plus encore.