Как было сказано в комментариях, это более автоматически, чем вы думаете.
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
ZoneId zone = ZoneId.of("America/New_York");
String dateTime = "2018-04-23 19:50:53.236";
ZonedDateTime usEasternTime = LocalDateTime.parse(dateTime, inputFormatter)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(zone);
String formattedDateTime = usEasternTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(formattedDateTime);
Вывод:
2018-04-23T15: 50: 53.236-04: 00
Запрошенное вами смещение -04:00
выводится как часть стандартного формата ISO 8601. Вывод времени 15:50:53, где вы просили 19:50:53. Я понял, что 19:50:53 был в UTC, и в это время UTC время в восточной части США составляет 15:50:53 или на 4 часа меньше.
Если вместо этого мы берем дату зимой, мы получим -05:00
, а время дня будет на 5 часов меньше времени UTC:
String dateTime = "2018-11-23 19:50:53.236";
2018-11-23T14: 50: 53.236-05: 00
EDIT
любая идея, как удалить миллисекунды ...
String formattedDateTime = usEasternTime.truncatedTo(ChronoUnit.SECONDS)
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
2018-04-23T15: 50: 53-04: 00
(продолжение)
… а это [America/New_York]
Когда вы печатаете ZonedDateTime
, идентификатор зоны также печатается. Выше я использую встроенный форматер для управления выводом. Другой вариант - конвертировать в OffsetDateTime
:
OffsetDateTime odt = usEasternTime.truncatedTo(ChronoUnit.SECONDS)
.toOffsetDateTime();
System.out.println(odt);
2018-04-23T15: 50: 53-04: 00
Если бы 19:50:53 было по восточному времени, все было бы немного проще:
ZonedDateTime usEasternTime = LocalDateTime.parse(dateTime, inputFormatter)
.atZone(zone);
2018-04-23T19: 50: 53.236-04: 00
Текущий способ определения часового пояса - регион / город , поэтому я использую America/New_York
, хотя устаревший US/Eastern
все еще работает и дает тот же результат.
Класс TimeZone
имеет проблемы с дизайном и устарел, заменен на ZoneId
, поэтому просто используйте последний.
Ссылка: Список часовых поясов базы данных tz в Википедии