如何在太平洋标准时间获得毫秒到午夜

How to get millis to midnigth at PST

我需要获取从现在到 "America/Los_Angeles"(太平洋标准时间)午夜之间的毫秒数。

midnightAtPST = ???;

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

这是我目前拥有的,它给出了错误的值:

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);

由于您对特定时区的时间感兴趣,因此请不要使用没有时区概念的 LocalDateTime,而是使用 ZonedDateTime.

您可以使用类型 LocalDate 上的 ZonedDateTime.now(zone) static factory. Then, you can have the date at midnight (on the next day) in a given timezone with the method atStartOfDay(zone) 获取给定区域中的当前日期。

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);

这将正确地 return 当前日期与洛杉矶第二天开始之间的毫秒数。

您的方法很好,除了 now 瞬间,您将其从您的时区转换为 UTC 时区,给出了您不想要的偏移量。

这应该会如您所愿:

Instant now = Instant.now();