Обрезать дату до начала дня в заданном часовом поясе

#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