Java.time от смещения до имени часового пояса - PullRequest
0 голосов
/ 10 мая 2018

Попытка преобразовать различные форматы времени в единый формат.

Один формат

"uuuu-MM-dd'T'HH:mm:ss-5000"

необходимо преобразовать в формат часового пояса:

"uuuu-MM-dd'T'HH:mm:ss EST"

Используя следующий код, но он дает только часовой пояс как "-05: 00 ", но не ожидаемое" EST ".

    String targetFormat = "uuuu-MM-dd'T'HH:mm:ss z";
    String origFormat = "uuuu-MM-dd'T'HH:mm:ss.SSSZ";
    String origStr = "2018-02-05T17:25:18.156-0500";
    ZonedDateTime time = ZonedDateTime.parse(origStr, DateTimeFormatter.ofPattern(origFormat));
    String targetStr = time.format(DateTimeFormatter.ofPattern(targetFormat));

Вывод из вышесказанного:

2018-02-05T17:25:18 -05:00

Как получить ожидаемое:

2018-02-05T17:25:18 EST

1 Ответ

0 голосов
/ 11 мая 2018

-05:00 на самом деле не часовой пояс.Это просто смещение: разница в 5 часов отстает от UTC, и вы не можете отобразить его в одном часовом поясе.

На дату, которую вы используете (2 февраля 2018 г.), есть 47 часовых поясов, использующих-05:00 *, включая районы за пределами США - и многие из них не называют свои часовые пояса "EST", такие как Лима, которая использует "PET" (время Перу) или Богота, которая использует "COT""(Колумбийское время).Независимо от имен, используемых в каждом месте, все они используют -05:00 в дату и время, которое вы используете.

В любом случае, когда вы анализируете смещение, такое как -05:00, API может 'не знаю, на какой часовой пояс вы ссылаетесь, по причинам, перечисленным выше (их больше одного, и сам API не может их решить).Вы должны произвольно выбрать часовой пояс, а затем преобразовать проанализированный ZonedDateTime в эту зону:

....
ZonedDateTime time = ZonedDateTime.parse(origStr, DateTimeFormatter.ofPattern(origFormat));

// convert to some arbitrary timezone
time = time.withZoneSameInstant(ZoneId.of("America/New_York"));

Я выбрал "America / New_York", потому что это тот, который использует "EST"в феврале 2018. При этом ваш targetStr будет:

2018-02-05T17: 25: 18 EST

Измените имя часового пояса на то, которое выхочу.Обратите внимание, что для дат в июне, когда в Нью-Йорке действует летнее время, будет возвращено «EDT».


*: я используюJDK 8 с файлами данных TZ 2018e, поэтому это число может отличаться в вашей среде.

...