Comment définir l’heure d’un object de date dans Java

J’ai créé un object Date en Java. Quand je le fais, cela montre quelque chose comme: date=Tue Aug 09 00:00:00 IST 2011 . En conséquence, il semble que mon fichier Excel soit réduit d’un jour (27 février devient 26 février et ainsi de suite). Je pense que cela doit être dû au temps. Comment puis-je définir quelque chose comme 17h30?

 Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY,17); cal.set(Calendar.MINUTE,30); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); Date d = cal.getTime(); 

Regarde aussi

  • Temps Joda
  • Doc du calendrier

Pouvez-vous afficher le code que vous utilisez pour définir un object de date? Quoi qu’il en soit

 new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00") 

Je voudrais apporter la réponse moderne. Cela implique l’utilisation de java.time , l’API moderne de date et heure de Java, et non l’ancienne Date ni le Calendar sauf s’il est impossible de l’éviter.

Votre problème est très probablement un problème de fuseau horaire. Quand il est mar 09 août 00:00:00 IST 2011, dans les fuseaux horaires à l’ouest d’IST, minuit n’a pas encore été atteint. Il est encore le 8 août. Si, par exemple, votre API pour placer la date dans Excel attend UTC, la date sera celle précédant celle que vous aviez prévue. Je pense que la vraie et bonne solution consiste à produire une date / heure de 00:00 UTC (ou quel que soit le fuseau horaire ou le décalage attendu et utilisé à l’autre bout).

  LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27); ZonedDateTime utcDateDime = yourDate.atStartOfDay(ZoneOffset.UTC); System.out.println(utcDateDime); 

Ceci imprime

 2018-02-27T00:00Z 

Z signifie UTC (pensez à un décalage de zéro par rapport au fuseau horaire UTC ou Zulu). Mieux encore, bien sûr, si vous pouviez passer le LocalDate de la première ligne de code à Excel. Il n’inclut pas l’heure du jour, il n’y a donc pas de confusion possible. D’un autre côté, si vous avez besoin d’un object Date ancienne, convertissez-le juste avant de remettre la Date :

  Date oldfashionedDate = Date.from(utcDateDime.toInstant()); System.out.println(oldfashionedDate); 

Sur mon ordinateur cela imprime

 Tue Feb 27 01:00:00 CET 2018 

Ne soyez pas dupe, c’est correct. Mon fuseau horaire (heure d’Europe centrale) est décalé de +01: 00 par rapport à UTC en février (heure standard), donc 01:00:00 est égal à 00:00:00 UTC. C’est juste Date.toSsortingng() saisit le fuseau horaire de la JVM et l’utilise pour produire la chaîne.

Comment puis-je définir quelque chose comme 17h30?

Pour répondre directement à votre question directe, si vous avez un ZonedDateTime , OffsetDateTime ou LocalDateTime , dans tous les cas, ce qui suit accomplira ce que vous avez demandé:

  yourDateTime = yourDateTime.with(LocalTime.of(17, 30)); 

Si yourDateTime était un LocalDateTime de 2018-02-27T00:00 , il sera désormais 2018-02-27T17:30 . De même, pour les autres types, seuls les décalages et les fuseaux horaires sont inclus.

Si vous n’aviez qu’une date, comme dans le premier extrait ci-dessus, vous pouvez également lui append des informations d’heure:

  LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27); LocalDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30)); 

Pour la plupart des cas, vous devriez préférer append l’heure du jour dans un fuseau horaire spécifique, par exemple

  ZonedDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30)) .atZone(ZoneId.of("Asia/Kolkata")); 

Cela donne 2018-02-27T17:30+05:30[Asia/Kolkata] .

Date et Calendar vs java.time

La classe Date que vous utilisez ainsi que Calendar et SimpleDateFormat utilisés dans les autres réponses sont obsolètes depuis longtemps, et SimpleDateFormat en particulier s’est avéré problématique. Dans tous les cas, l’API moderne de date et d’heure de Java est tellement plus agréable à utiliser. C’est pourquoi j’ai voulu apporter cette réponse à une vieille question qui est toujours en cours de visite.

Lien: Oracle Tutorial Date Time , expliquant comment utiliser java.time .