Используйте ZoneId
и ZonedDateTime
.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss", Locale.ENGLISH);
ZoneId zone = ZoneId.of("Europe/Berlin");
long seconds = 1_556_000_000;
ZonedDateTime dateTime = Instant.ofEpochSecond(seconds).atZone(zone);
String formattedDateTime = dateTime.format(formatter);
System.out.println(formattedDateTime);
Вывод этого фрагмента:
23.04.2019 08: 13: 20
В моем примере значение секунд соответствует 06:13:20 UTC, поэтому вы получили двухчасовое смещение относительно UTC.
Встроено летнее время (DST), поэтому зимой вы получите только 1 час от UTC, как и положено. Исторические изменения в смещении тоже работают «из коробки», и известны будущие изменения (что происходит в Германии после 2021 года, никто не знает).