2016-08-31 4 views
1

Je dois obtenir le nombre de millisecondes entre maintenant et minuit à "America/Los_Angeles" (PST).Comment obtenir millis à midnigth à PST

midnightAtPST = ???; 

long millis = ChronoUnit.MILLIS.between(now, midnightAtPST) ??? 

C'est ce que j'ai pour l'instant, ce qui donne une valeur incorrecte:

LocalDateTime midnight = LocalDateTime.now().toLocalDate().atStartOfDay().plusDays(1); 
Instant midnigthPST = midnight.atZone(ZoneId.of("America/Los_Angeles")).toInstant(); 
Instant now = LocalDateTime.now().toInstant(ZoneOffset.UTC); 

long millis = ChronoUnit.MILLIS.between(now, midnigthPST); 
+0

Quel est le problème? –

Répondre

1

Puisque vous êtes intéressé pour le moment dans une zone spécifique, ne pas utiliser un LocalDateTime, qui ne avoir la notion de fuseau horaire, mais utilisez un ZonedDateTime.

Vous pouvez obtenir la date actuelle dans une zone donnée avec la fabrique statique ZonedDateTime.now(zone). Ensuite, vous pouvez avoir la date à minuit (le jour suivant) dans un fuseau horaire donné avec la méthode atStartOfDay(zone) sur le type LocalDate.

ZoneId zoneId = ZoneId.of("America/Los_Angeles"); 
ZonedDateTime now = ZonedDateTime.now(zoneId); 
ZonedDateTime midnight = LocalDate.now().atStartOfDay(zoneId).plusDays(1); 

long millis = ChronoUnit.MILLIS.between(now, midnight); 

Ceci retournera correctement le nombre de millisecondes entre la date actuelle et le début du jour suivant à Los Angeles.

+0

Merci! Ça a l'air plus clair :) – HoTicE

0

Votre approche est correcte, à l'exception de l'instant now, que vous convertissez en fuseau horaire UTC à partir de votre fuseau horaire, en donnant un décalage que vous ne voulez pas.

Cela devrait fonctionner comme prévu:

Instant now = Instant.now();