Попытка преобразовать дату String, которая находится в Австралии / Сиднее, в Австралию / Брисбен. Я хочу это в Java8, используя LocalDateTime
Я пробовал с датой и отлично работает, но дата устарела.
String sdate = "2019-01-14T01:42:00.19+11:00";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
format.setTimeZone(TimeZone.getTimeZone("Australia/Brisbane"));
try {
Date dd = format.parse(sdate);
DateFormat teradataFormate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(teradataFormate.format(dd));
} catch (ParseException e) {
e.printStackTrace();
}
//Code that doesn't work with LocalDateTime
String sdate = "2019-01-14T01:42:00.19+11:00";
LocalDateTime ldt = LocalDateTime.parse(sdate, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
ZonedDateTime brisy = ldt.atZone(ZoneId.of("Australia/Brisbane"));
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(format1.format(brisy));
ожидается: 2019-01-14 00:42:00 актуально: 2019-01-14 01:42:00




Используйте ZonedDateTime вместо LocalDateTime. LocalDateTime не поддерживает летнее время.
Используйте withZoneSameInstant () вместе с withZoneSameLocal
ZonedDateTime sydneyTime = ZonedDateTime.parse(sdate);
ZonedDateTime brisyTime = sydneyTime.withZoneSameInstant(ZoneId.of("Australia/Brisbane"));
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(brisyTime.format(format1));
Удивительный. Он работал с offsetDateTime. Спасибо, что объяснили разницу между смещением и часовым поясом.
Красиво объясненный и элегантный ответ, спасибо. Поскольку
sdateсодержит смещение (+11:00) и не содержит часового пояса (например,Australia/Sydney), дальнейшее незначительное улучшение заключается в синтаксическом анализеOffsetDateTimeи последующем использовании его методаatZoneSameInstant.