web-dev-qa-db-fra.com

Pourquoi Java Date.getYear () renvoie 111 au lieu de 2011?

J'ai quelques difficultés à analyser une date de chaîne en un objet Date. J'utilise un DateFormat pour analyser la chaîne, et lorsque j'imprime la valeur de la date, cela me donne ce que j'attends.

Mais quand j'essaie d'obtenir le jour, le mois ou l'année, cela me donne des valeurs fausses. Par exemple, l'année est 2011, mais quand je fais .getYear(), cela me donne 111. Je ne sais pas pourquoi cela se produit. Voici le segment de code pertinent:

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

Lorsque j'imprime dateFrom, je reçois Sun Dec 04 00:00:00 GMT 2011, ce à quoi vous vous attendriez. Mais l'impression .getYear() renvoie 111.

Je dois pouvoir obtenir le jour, le mois et l'année de la date pour un graphique de série chronologique.

41
Ben Calder

Ces méthodes ont été obsolète. Au lieu de cela, utilisez le Calendar class. 


import Java.text.DateFormat;
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;

public final class DateParseDemo {
    public static void main(String[] args){
         final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
         final Calendar c = Calendar.getInstance();
         try {
             c.setTime(df.parse("04/12/2011"));
             System.out.println("Year = " + c.get(Calendar.YEAR));
             System.out.println("Month = " + (c.get(Calendar.MONTH)));
             System.out.println("Day = " + c.get(Calendar.DAY_OF_MONTH));
         } 
         catch (ParseException e) {
             e.printStackTrace();
         }
    }
}

Sortie:

Year = 2011
Month = 3
Day = 12

Et comme pour le champ mois, il est basé sur 0. Cela signifie que janvier = 0 et décembre = 11. Comme indiqué par le javadoc

Numéro de champ pour get et set indiquant le mois. C'est un valeur spécifique au calendrier. Le premier mois de l'année dans le grégorien et les calendriers Julian sont JANUARY qui est 0; le dernier dépend du nombre de mois dans une année.

42
mre

Javadoc à la rescousse:

Obsolète À partir de la version 1.1 du JDK, remplacé par Calendar.get (Calendar.YEAR) - 1900.

Retourne une valeur résultant de la soustraction de 1900 du année qui contient ou commence par l'instant dans le temps représenté par cet objet Date, tel qu'interprété dans le fuseau horaire local.

Vous ne devez pas utiliser de méthodes obsolètes. Les méthodes obsolètes sont des méthodes qui ne devraient plus être utilisées. Mais quelle que soit la méthode que vous utilisez, lisez son javadoc pour savoir ce qu’il fait.

10
JB Nizet

Le président Evil l'a cloué, Date.getYear() renvoie une valeur résultant de la soustraction de 1900 de l'année qui contient. Et vous, vous ne devriez pas l'utiliser.

Mais la solution rapide pour le code dans la question est la suivante:

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

    // Add 1900 to dateFrom.getYear() 

    System.out.println(dateFrom.getYear()+1900);
} catch (ParseException e) {
    e.printStackTrace();
}
9
Dimitar Pavlov

Ce n'est qu'une hypothèse, mais le 111 pourrait être le nombre d'années depuis 1900. Consultez la documentation/effectuez des tests pour vérifier cela (je ne peux pas vérifier pour le moment)

3
epochengine

http://download.Oracle.com/javase/1.4.2/docs/api/Java/util/Date.html#getYear%28%29

La spécification indique qu'elle renvoie l'année moins 1900. Probablement une bonne idée d'éviter également les méthodes obsolètes.

3
bdares