Невозможно преобразовать Сидней в Брисбен LocalDateTime в Java8

Попытка преобразовать дату 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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
207
1

Ответы 1

  1. Используйте ZonedDateTime вместо LocalDateTime. LocalDateTime не поддерживает летнее время.

  2. Используйте 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));
    

Красиво объясненный и элегантный ответ, спасибо. Поскольку sdate содержит смещение (+11:00) и не содержит часового пояса (например, Australia/Sydney), дальнейшее незначительное улучшение заключается в синтаксическом анализе OffsetDateTime и последующем использовании его метода atZoneSameInstant.

Ole V.V. 14.01.2019 06:22

Удивительный. Он работал с offsetDateTime. Спасибо, что объяснили разницу между смещением и часовым поясом.

Sarada Chelluboyena 14.01.2019 07:06

Другие вопросы по теме