web-dev-qa-db-fra.com

Le mois n'est pas imprimé à partir d'une date - Java DateFormat

Comment obtenir le mois d'une date en Java: 

        DateFormat inputDF  = new SimpleDateFormat("mm/dd/yy");
        Date date1 = inputDF.parse("9/30/11");

        Calendar cal = Calendar.getInstance();
        cal.setTime(date1);

        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int year = cal.get(Calendar.YEAR);

        System.out.println(month+" - "+day+" - "+year);

Ce code renvoie le jour et l'année mais pas le mois.

sortie: 

0 - 30 - 2011
10
bigData

En effet, votre format est incorrect: vous avez besoin de "MM/dd/yy" pour le mois, car "mm" correspond aux minutes:

DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");
Date date1 = inputDF.parse("9/30/11");

Calendar cal = Calendar.getInstance();
cal.setTime(date1);

int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int year = cal.get(Calendar.YEAR);

System.out.println(month+" - "+day+" - "+year);

Imprime 8 - 30 - 2011 (car les mois sont basés sur zéro; démo )

17
dasblinkenlight

Premièrement, vous avez utilisé mm dans votre format de date, qui est "minutes" selon les Javadocs . Vous définissez les minutes sur 9, pas le mois. Il semble que le mois par défaut est 0 (janvier).

Utilisez MM (capital 'M's) pour analyser le mois. Ensuite, vous verrez 8, car dans Calendar mois commencent par 0, pas 1 . Ajoutez 1 pour récupérer le 9 souhaité.

Le premier mois de l'année dans les calendriers grégorien et julien est JANVIER qui est 0

// MM is month, mm is minutes
DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");  

et ensuite

int month = cal.get(Calendar.MONTH) + 1; // To shift range from 0-11 to 1-12
5
rgettman

Si vous lisez le SimpleDateFormat javadoc , vous remarquerez que mm dure quelques minutes. Vous avez besoin de MM par mois.

DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");

Sinon, le format ne lit pas un champ month et prend la valeur 0.

3

Temps pour quelqu'un de fournir la réponse moderne. Les autres réponses étaient bonnes lorsque la question a été posée en 2013 et sont toujours correctes. Aujourd'hui, rien ne vous empêche de lutter avec l'ancienne classe SimpleDateFormat à la fois obsolète et notoirement gênante. Java.time, l'API Java moderne pour la date et l'heure, est beaucoup plus agréable à utiliser:

    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("M/d/yy");
    LocalDate date1 = LocalDate.parse("9/30/11", inputFormatter);
    System.out.println(date1);

Cette imprime

2011-09-30

La classe LocalDate représente une date sans heure, exactement ce dont vous avez besoin, elle correspond à votre besoin beaucoup plus précisément que les anciennes classes Date et Calendar.

Les chaînes de modèle de format utilisées avec DateTimeFormatter ressemblent à celles de SimpleDateFormat, il existe quelques différences. Vous pouvez utiliser MM majuscule pour exiger un mois à deux chiffres (09, par exemple, septembre) ou une seule variable M pour permettre l'écriture du mois avec un ou deux chiffres. De même dd ou d pour le jour du mois. yy indique une année à deux chiffres et est interprété avec la base 2000, c’est-à-dire entre 2000 et 2099 inclus (cela ne fonctionnerait pas pour mon anniversaire).

Link: Tutoriel Oracle Trail: Date Time expliquant comment utiliser Java.time.

1
Ole V.V.

Le format du mois devrait être MM au lieu de mm

 DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");
1
Prabhaker

mmisans minutes, utilisez MM en spécifiant le format.

Calendar cal = Calendar.getInstance();
cal.setTime(date1);

int month = cal.get(Calendar.MONTH);// returns month value index starts from 0
0
Dax Joshi

Essayez comme ceci en utilisant MM au lieu de mm: -

    DateFormat inputDF  = new SimpleDateFormat("MM/dd/yy");
    Date date1 = inputDF.parse("9/30/11");

    Calendar cal = Calendar.getInstance();
    cal.setTime(date1);

    int month = cal.get(Calendar.MONTH);
    int day = cal.get(Calendar.DAY_OF_MONTH);
    int year = cal.get(Calendar.YEAR);

    System.out.println(month+" - "+day+" - "+year);

Le mois imprimé sera 8 car l'index commence à 0

ou essayez avec: -

int month = cal.get(Calendar.MONTH) + 1;
0
Rahul Tripathi