2016-08-31 7 views
1

Мне нужно получить миллисекунды между сегодняшним днем ​​и полночь в «America/Los_Angeles» (PST).Как получить миллисы до середины в PST

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

В чем проблема? –

ответ

1

Поскольку вы заинтересованы в то время в определенной зоне, не используйте в LocalDateTime, который не делает имеют понятие часовых поясов, но используйте ZonedDateTime.

Вы можете получить текущую дату в данной зоне с помощью статического завода ZonedDateTime.now(zone). Затем вы можете получить дату в полночь (на следующий день) в заданный часовой пояс методом atStartOfDay(zone) по типу 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); 

Это верно вернет число миллисекунд между текущей датой и началом следующего дня в Лос-Анджелесе.

+0

Спасибо! Это выглядит более ясно :) – HoTicE

0

Ваш подход прекрасен, за исключением моментального момента now, который вы конвертируете в часовой пояс UTC из своего часового пояса, предоставляя смещение, которое вам не нужно.

Это должно работать, как вы ожидаете:

Instant now = Instant.now(); 

 Смежные вопросы

  • Нет связанных вопросов^_^