Конвертировать дату и время с разными часовыми поясами в метку времени - PullRequest
0 голосов
/ 21 ноября 2019

есть небольшая проблема в Java: у меня есть две строки, представляющие дату (например, «2019-11-10») и время (например, «01: 23: 45.123»). Преобразовать их в метку времени UTC достаточно просто, но есть одна проблема:

Дата указывается в местном часовом поясе, например, «America / New_York», а время указывается в UTC, поэтому следующееинформация ...

date = "2019-11-10", time="01:23:45.123" (при условии местного часового пояса "America/New_York" для части даты)

... фактически будет временем UTC "2019-11-11 01:23:45.123" (поскольку только это будет нью-йоркская дата «2019-11-10»).

Предлагает ли Java Time API или joda time какой-либо удобный способ сделать это преобразование, сохраняя также такие детали, как DST и т. д. в уме? Есть ли (относительно) простой способ сделать это вообще?

Редактировать:

Возможно, это было немного неясно. Позвольте мне попытаться объяснить это с другой стороны:

Предполагая, что у меня DateTime x (в UTC) составляет "2019-11-11 01:23:45.123".

Тогда я могу получить часть даты y (как видно из"America / New_York"), просто преобразовав x в соответствующий часовой пояс и форматируя соответственно -> "2019-11-10".

Я также могу получить часть времени z (как видно в UTC), просто отформатировав соответственно -"01:23:45.123".

Теперь, предполагая, что у меня есть y и z - Как я могу получить x?

Редактировать 2:

Я только что понял, это будет никогда не работает идеально. Причина:

UTC "2019-11-04 04: 01: 00.000" -> США / Нью-Йорк: "2019-11-03 23:01"

UTC "2019-11-0304: 01: 00.000 "-> США / Нью-Йорк:" 2019-11-03 00:01 "

Так что, если я только получил информацию," дата в США / Нью-Йорке "равна" 2019-11-03«плюс» время в UTC »это« 04: 01: 00.000 », на самом деле возможны два решения, а не только одно.

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

Вы должны настроить дату, чтобы быть в часовом поясе Нью-Йорка, что можно сделать, выбрав произвольное время. Затем переведите время в Нью-Йорк, выбрав произвольную дату. Эти два могут тогда быть объединены, поскольку они имеют ту же самую зону. И конвертировать обратно в UTC

    LocalDate date = LocalDate.parse("2019-11-10");
    LocalTime time = LocalTime.parse("01:23:45.123");
    ZoneId zone = ZoneId.of("America/New_York");

    ZonedDateTime dateInZone = date.atStartOfDay(zone);
    ZonedDateTime timeInZone = time.atOffset(ZoneOffset.UTC).atDate(date).atZoneSameInstant(zone);
    ZonedDateTime resultNY = dateInZone.with(timeInZone.toLocalTime());
    ZonedDateTime resultUTC = resultNY.withZoneSameInstant(ZoneOffset.UTC)
    System.out.println(resultUTC);
    // 2019-11-11T01:23:45.123Z
0 голосов
/ 21 ноября 2019

Дата не может иметь часовой пояс. (Подумайте об этом.)

Возможно, вы имеете в виду первый момент дня для этой даты, как видно из UTC.

LocalDate ld = LocalDate.parse( "2019-11-10" ) ;
ZonedDateTime zdt = ld.atStartOfDay( ZoneOffset.UTC ) ; 

Отрегулируйте этот момент, чтобы он отображался в часовом поясе. .

ZoneId z = ZoneId.of( "America/New_York" ) ;
LocalTime lt = LocalTime.parse( "01:23:45.123" ) ;
ZonedDateTime zdt2 = zdt.with( lt ) ;
...