J'ai créé un objet Date
en Java. Lorsque je le fais, il affiche quelque chose comme: date=Tue Aug 09 00:00:00 IST 2011
. En conséquence, il semble que mon fichier Excel soit inférieur d’un jour (le 27 février devient le 26 février et ainsi de suite). Je pense que cela doit être dû au temps. Comment puis-je le régler à 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
Pouvez-vous afficher le code que vous utilisez pour définir l'objet de date? Quoi qu’il en soit <vous pouvez utiliser ce code pour l’initialisation de la date:
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 Java date et heure, et non l’ancien Date
ni Calendar
, sauf s’il est impossible de l'éviter.
Votre problème est très probablement vraiment un problème de fuseau horaire. Quand il est mardi 09 août à 00h00 heure de Paris, les fuseaux horaires situés à l'ouest de minuit ne sont pas encore atteints. Nous sommes toujours le 8 août. Si, par exemple, votre API pour mettre la date dans Excel s'attend à UTC, la date sera la veille de celle que vous souhaitez. Je crois que la vraie et bonne solution est de produire une date-heure de 00:00 UTC (ou le fuseau horaire ou le décalage prévu et utilisé à l’autre bout).
LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27);
ZonedDateTime utcDateDime = yourDate.atStartOfDay(ZoneOffset.UTC);
System.out.println(utcDateDime);
Cela imprime
2018-02-27T00:00Z
Z
signifie UTC (pensez à zéro décalé par rapport au fuseau horaire UTC ou Zulu). Mieux encore, si vous pouviez passer le LocalDate
de la première ligne de code à Excel. Il n'inclut pas l'heure, donc il n'y a pas de confusion possible. D'un autre côté, si vous avez besoin d'un objet Date
à l'ancienne, convertissez-le juste avant de passer le 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é à +01: 00 par rapport à UTC en février (heure normale), donc 01:00:00 correspond à 00:00:00 UTC. C’est juste Date.toString()
saisir le fuseau horaire de la machine virtuelle et l’utiliser pour produire la chaîne.
Comment puis-je le régler à quelque chose comme 17h30?
Pour répondre directement à votre question directe, si vous avez un ZonedDateTime
, OffsetDateTime
ou LocalDateTime
, tous les cas suivants rempliront ce que vous avez demandé:
yourDateTime = yourDateTime.with(LocalTime.of(17, 30));
Si yourDateTime
était un LocalDateTime
de 2018-02-27T00:00
, Il s'agira maintenant de 2018-02-27T17:30
. De même pour les autres types, seuls ceux-ci incluent le décalage et le fuseau horaire, le cas échéant.
Si vous aviez seulement une date, comme dans le premier extrait ci-dessus, vous pouvez également y ajouter des informations sur l'heure:
LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27);
LocalDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30));
Dans la plupart des cas, vous devriez préférer ajouter l’heure du jour à un fuseau horaire spécifique, bien que, 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ées dans les autres réponses sont périmées depuis longtemps, et SimpleDateFormat
en particulier s'est avéré gênant. Dans tous les cas, l’API moderne Java date et heure est beaucoup plus agréable à travailler. C’est pourquoi je voulais fournir cette réponse à une vieille question qui fait toujours l’objet d’une visite.
Lien: Date du tutoriel Oracle , expliquant comment utiliser Java.time
.