#date #java-8 #timezone #jodatime
#Дата #java-8 #Часовой пояс #jodatime
Вопрос:
Я хочу сократить время даты до начала дня для данного часового пояса. Если текущее время равно Mon Aug 24 15:38:42 America/Los_Angeles
, оно должно быть усечено до начала дня Mon Aug 24 00:00:00 America/Los_Angeles
, которое затем позже должно быть преобразовано в эквивалентное время UTC.
Я изучил методы, предоставляемые Joda Time Library, Apache Commons Library and ZonedDateTime
, но все они усекают дату и время в UTC, а не в определенном часовом поясе.
Может ли кто-нибудь помочь мне с этим? Заранее спасибо.
Ответ №1:
Вы можете использовать ZonedDateTime
. Используйте toLocalDate()
вкл ZonedDateTime
, чтобы получить LocalDate
затем atStartOfDay
вкл LocalDate
с zone of ZonedDateTime
экземпляра, чтобы получить начало дня.
Пример:
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
ZonedDateTime startOfDay = now.toLocalDate().atStartOfDay(now.getZone());
DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
System.out.println(now.format(formatter)); // Mon, 24 Aug 2020 10:41:41 -0700
System.out.println(startOfDay.format(formatter)); // Mon, 24 Aug 2020 00:00:00 -0700
Ответ №2:
ZonedDateTime
обрезает в своем собственном часовом поясе. Таким образом, это можно сделать немного проще, чем в принятом в настоящее время ответе (который также является хорошим и правильным ответом).
ZonedDateTime given = ZonedDateTime.of(2020, 8, 24, 15, 38, 42, 0, ZoneId.of("America/Los_Angeles"));
ZonedDateTime startOfDay = given.truncatedTo(ChronoUnit.DAYS);
System.out.println("Truncated to start of day: " startOfDay);
Instant inUtc = startOfDay.toInstant();
System.out.println("In UTC: " inUtc);
Вывод:
Truncated to start of day: 2020-08-24T00:00-07:00[America/Los_Angeles] In UTC: 2020-08-24T07:00:00Z