2017-06-07 4 views
2

Étant donné un LocalTime dans un donné ZoneId, comment puis-je trouver le ajusté sur UTC?Ajuster LocalTime selon ZoneId

Je cherche quelque chose de similaire à .atZone de LocalDateTime, mais je n'ai rien trouvé.

Je suppose que je peux l'utiliser avec atOffset, mais je ne comprends pas vraiment comment l'utiliser.

Ainsi, par exemple:

LocalTime: 15:00 
ZoneId: America/Sao_Paulo (GMT -3) 
Output: 18:00 
+3

Vous devez donner une date aussi. Dans le cas où la zone a l'heure d'été (DST), par exemple, cela est nécessaire pour appliquer le décalage correct. –

Répondre

5

Vous devez donner une date aussi. Dans le cas où la zone a l'heure d'été (DST), par exemple, cela est nécessaire pour appliquer le décalage correct (je ne sais pas si São Paulo utilise l'heure d'été, mais Java exige toujours une date).

Et encore cela prend un pas de plus que ce que vous pourriez vous attendre, mais c'est assez simple une fois que vous savez comment. Pour le cas de la démonstration, j'ai supposé que vous vouliez dire 15:00 aujourd'hui, ce que vous avez à peine fait, mais je vous fais confiance pour remplir vous-même la date souhaitée.

LocalTime time = LocalTime.of(15, 0); 
    LocalTime utcTime = LocalDateTime.of(LocalDate.now(), time) 
      .atZone(ZoneId.of("America/Sao_Paulo")) 
      .withZoneSameInstant(ZoneOffset.UTC) 
      .toLocalTime(); 
    System.out.println(utcTime); 

Cette imprime le résultat que vous aussi demandé

18:00 
+1

Oui, São Paulo a l'heure d'été. Et je ne suis pas sûr si l'appel à 'toOffsetDateTime' est nécessaire (peut-être que vous pourriez simplement utiliser' ZonedDateTime.withZoneSameInstant' mais je ne suis pas devant un ordinateur pour tester). Quoi qu'il en soit, +1 à vous! –

+2

Merci, @Hugo, pour la légère simplification (j'avais cherché ** à ** Zone, dans ce cas c'est ** avec ** Zone). –

+1

J'espérais éviter 'LocalDateTime', mais je ne considérais pas DST! Merci pour cela, il semble que ce soit la bonne façon de procéder. – Matheus208

5

A ZoneId n'a pas de sens parce que la date est manquante, mais vous pouvez utiliser un ZoneOffset de cette façon:

LocalTime time = LocalTime.of(15, 0); 
ZoneOffset offset = ZoneOffset.ofHours(-3); 
LocalTime utc = 
    OffsetTime.of(time, offset).withOffsetSameInstant(ZoneOffset.UTC).toLocalTime(); 
System.out.println(utc); // 18:00 
+0

Merci pour la réponse informative! Cependant, la réponse de @Ole V.V. m'a fait réaliser que j'avais un défaut de concept dans ma logique (je ne tenais pas compte de DST). C'est pourquoi j'ai augmenté les deux réponses, mais j'ai dû accepter les leurs. – Matheus208

+0

@ Matheus208 Je suis d'accord avec vous que l'utilisation d'un type global comme 'Instant' ou' ZonedDateTime' est généralement le meilleur choix. Ma réponse était principalement basée sur l'impression que vous n'avez pas une chance de déterminer le contexte instantané. Théoriquement, ma réponse pourrait être améliorée en déterminant le décalage dépendant d'un instant (qui nécessite aussi une date): 'ZoneId.of (" America/Sao_Paulo "). GetRules(). GetOffset (instantané)' Mais c'est encore plus codage que ce que vous a donné Ole. –