Преобразовать LocalDateTime в LocalDateTime с указанием c Зоны в Java - PullRequest
2 голосов
/ 03 февраля 2020

Мне нужно сделать LocalDateTime преобразование даты UT C в другую переменную LocalDateTime с учетом заданного c часового пояса tz.

Во время моего исследования я нашел много решений, но все они преобразуют LocalDateTime в другой тип, например ZonedDateTime.

Мне нужно что-то подобное, но LocalDateTime не будет работать с ZoneId:

LocalDateTime output = input.getInitDate().of(ZoneId.of(tz))

Учитывая часовой пояс -3:

    input: 2019-12-03T18:24:07

    output: 2019-12-03T15:24:07

Ответы [ 3 ]

5 голосов
/ 04 февраля 2020

Ваш вопрос не имеет смысла.

Вы должны понимать, что LocalDateTime содержит только дату и время суток. Класс преднамеренно лишен какой-либо концепции часового пояса или смещения от UT C. Так что LocalDateTime не не представляет момент. Имя может вводить в заблуждение, так как LocalDateTime означает , а не для какой-либо конкретной местности.

Если вы хотите отслеживать момент в UT C, используйте Instant .

Instant instant = Instant.now() ;  // Capture the current moment in UTC. Always in UTC, by definition.

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

ZoneId z = ZoneId.of( "America/Montevideo" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

LocalDateTime преобразование UT C date

Вы подразумеваете, что имеете в виду конкретную дату и время, которые видны на простом меридиане? Или, как видно из Исландия , который использует UT C в качестве часового пояса?

LocalDate ld = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 15 , 0 ) ;  // 3 PM.
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ;

Этот ldt объект означает «3 часа дня 23-го числа». Январь этого года " где-то или где-нибудь . Но этот LocalDateTime объект делает не 3 PM в одном конкретном месте . Мы понятия не имеем, будет ли здесь 15:00 в Токио, Япония или 15:00 в Тулузе, Франция или 15:00 в Толедо, Огайо, США. Это были бы три разных момента с интервалом в несколько часов. LocalDateTime представляет ни одного из них или всех из них, в зависимости от того, как вы хотите их видеть, но не какой-либо из них.

Чтобы определить момент от даты и времени суток, вам нужен контекст часового пояса или смещение от UT C. Другими словами, третья часть информации, в дополнение к дате и времени суток, нам нужна "как видно из Парижа, Франция" или "как видно из Станция Палмера в Антарктиде". С таким контекстом мы получаем либо ZonedDateTime или OffsetDateTime, соответственно.

ZoneId z = ZoneId.of( "Antarctica/Palmer" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ldt , z ) ;  // Giving context of time zone to the date-with-time `LocalDateTime` object. Determines a moment.

Чтобы увидеть тот же момент в UT C (смещение нуля часов-минут-секунд), извлеките Instant.

Instant instant = zdt.toInstant() ;  // Adjust from time zone to UTC.

Часовой пояс и смещение от UT C

Учитывая -3 часовой пояс:

Нет , -3 - это не часовой пояс, это смещение.

-3 - это сокращение от -03:00. С практической точки зрения, я рекомендую вам не сокращать смещение, так как некоторые библиотеки ожидают полных часов с минутами, включая символ двоеточия и включая ведущий ноль в сингле-ди git часах или минутах.

The -3 или -03:00 означает просто «три часа позади UT C».

Часовой пояс гораздо больше. Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона. Часовой пояс имеет название в виде Continent/Region, например Africa/Tunis или Europe/Paris.

См. список часовых поясов в Википедии. Сортировать по смещенному столбцу. Обратите внимание, что сегодня около трех дюжин часовых поясов делят смещение -03:00, например America/Montevideo, Atlantic/Stanley и Antarctica/Palmer.

Всегда предпочитайте часовой пояс простому смещению. При выполнении математики даты и времени и сложении / вычитании промежутков времени результаты могут отличаться в зависимости от часового пояса. Часовые пояса могут использовать другие смещения, отличные от -03:00 в другие даты в прошлом и будущем.


Table of all date-time types in Java, both modern and legacy

3 голосов
/ 03 февраля 2020

Вам нужно сначала преобразовать его в ZonedDateTime, изменить часовой пояс, а затем извлечь LocalDateTime из этого:

ZoneId from = ...;
ZoneId to = ...;
LocalDateTime input = ...;
LocalDateTime output = input.atZone(from).withZoneSameInstant(to).toLocalDateTime();
2 голосов
/ 03 февраля 2020

Попробуйте это решение:

LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);

ZonedDateTime ldtZoned = ldt.atZone(ZoneId.systemDefault());
ZonedDateTime utcZoned = ldtZoned.withZoneSameInstant(ZoneId.of("UTC-3"));
System.out.println(utcZoned.toLocalDateTime());

Это дает вывод:

2020-02-03T20:55:33.313882
2020-02-03T17:55:33.313882
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...