Création d'un objet de date Java à partir de l'année, du mois, du jour

94
int day = Integer.parseInt(request.getParameter("day"));  // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988

System.out.println(year);

Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);  

b.setDob(c.getTime());

System.out.println(b.getDob());  

La sortie est:

1988
mer 25 janvier 00:00:08 IST 1989

Je passe 25 12 1988mais je reçois 25 Jan 1989. Pourquoi?

JAVAGeek
la source
1
Qu'est-ce que b dans le code?
MysteryGuy

Réponses:

109

Les mois sont basés sur zéro dans Calendar. Donc 12 est interprété comme décembre + 1 mois. Utilisation

c.set(year, month - 1, day, 0, 0);  
JB Nizet
la source
5
Concepteurs d'API IBM, concepteurs d'API JavaScript. A part ça, probablement personne. Notez que Calendar est maintenant obsolète par l'API Java 8 java.time, qui fait ce qu'il faut.
JB Nizet
63

C'est ma méthode préférée avant Java 8:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Je dirais que c'est une approche plus propre que:

calendar.set(year, month - 1, day, 0, 0);
Fred Porciúncula
la source
4
Le mois peut être spécifié en utilisant des Calendarconstantes, par exemple. Calendar.FEBRUARY.
Geekarist
1
Attention, les mois étaient numérotés à partir de zéro dans Java 7. Utilisez des constantes pour éviter les problèmes.
jediz
25

java.time

Utilisation du java.timeframework intégré à Java 8

int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter 
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22

Si vous avez également besoin d'informations sur l'heure (heure, minute, seconde), utilisez une conversion de LocalDateàLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
Przemek
la source
Bonne réponse, mais spécifiez un fuseau horaire s'il est connu. A LocalDaten'a pas de fuseau horaire et ne représente donc pas un moment exact sur la chronologie. Si votre contexte indique un fuseau horaire, appliquez-le pour obtenir un ZonedDateTimeobjet: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque
8

La représentation du calendrier de Java n'est pas la meilleure, ils y travaillent pour Java 8. Je vous conseillerais d'utiliser Joda Time ou une autre bibliothèque similaire.

Voici un exemple rapide utilisant LocalDate de la bibliothèque Joda Time:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

Ici, vous pouvez suivre un tutoriel de démarrage rapide.

Fdiazreal
la source
6

Voir JavaDoc :

mois - la valeur utilisée pour définir le champ de calendrier MOIS. La valeur du mois est basée sur 0. par exemple, 0 pour janvier.

Ainsi, le mois que vous définissez est le premier mois de l'année prochaine.

zw324
la source
0

Simplifiez-vous la vie lorsque vous travaillez avec des dates, des horodatages et des durées. Utiliser HalDateTime à partir de

http://sourceforge.net/projects/haldatetime/?source=directory

Par exemple, vous pouvez simplement l'utiliser pour analyser votre entrée comme ceci:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

Vous pouvez également spécifier des modèles pour l'analyse et l'impression.

Hajo Lemcke
la source
3
On dirait que vous faites la promotion de votre propre cours de bibliothèque? C'est probablement autorisé, mais cela aurait l'air plus agréable si vous mentionniez si vous êtes un développeur principal de HalDateTime.
Ole VV
Je n'ai pas voté contre. Cependant, la vie n'est jamais facile avec les dates. Votre bibliothèque ne changera pas ce fait.
kiltek
Pourquoi voter contre? Ma bibliothèque date de 2013. Toutes les fonctionnalités sont disponibles dans java.time comme spécifié dans JSR 310 que je trouve personnellement comme l'une des API les mieux conçues. Je recommande vivement d'utiliser celui-là.
Hajo Lemcke