web-dev-qa-db-fra.com

Comment définir l'heure d'un objet de date dans java

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?

60
CyprUS
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

137
Jigar Joshi

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")
14
Eugene Burtsev

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.

5
Ole V.V.