Джава.Преобразование времени в часовых поясах EDT, CDT, CST и т. Д. В UTC на основе названия часового пояса - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть API, который возвращает время и часовой пояс отдельно

time: "2018-12-18 16:00:28"

timezone: "EDT"

Как я могу проанализировать его по времени в UTC?

Часовые пояса, которые возвращаются из API: EDT, CDT, CST, ESTи т.д.

Я пытаюсь найти решение в библиотеках Java java.time и java.util.TimeZone, но они не работают с некоторыми именами часовых поясов.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете разобрать его как LocalDateTime, а затем установить TimeZone вручную:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime= LocalDateTime.parse("2018-12-18 16:00:28", formatter);
ZonedDateTime zonedDateTime = localDateTime
        .atZone(ZoneId.of("EST", ZoneId.SHORT_IDS))
        .withZoneSameInstant(ZoneId.of("UTC", ZoneId.SHORT_IDS));
0 голосов
/ 18 декабря 2018

Объедините ваши строки вместе, чтобы их можно было проанализировать вместе.Затем вы можете выполнить синтаксический анализ ZonedDateTime перед тем, как сменить зону на любую другую.

String timestamp = "2018-12-18 16:00:28";
String zone = "EDT";
String timeWithZone = timestamp + ' ' + zone;

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .append(DateTimeFormatter.ISO_LOCAL_DATE)
    .appendLiteral(' ')
    .append(DateTimeFormatter.ISO_LOCAL_TIME)
    .appendLiteral(' ')
    .appendPattern("z") // Zone
    .toFormatter();

ZonedDateTime edt = ZonedDateTime.parse(timeWithZone, formatter);
ZonedDateTime utc = edt.withZoneSameInstant(ZoneId.of("UTC"));
...