Преобразовать строку в ZonedDateTime - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно преобразовать строку 2020-04-15T23: 00: 00 + 0000 в ZonedDateTime. Я попробовал следующее, но они не работали:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss Z");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 00:00");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 0000");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

Я также использовал ISO_LOCAL_DATE_TIME, но это не сработало. Любые идеи?

Обновление:

Я попробовал ниже:

    OffsetDateTime dateTime1 = OffsetDateTime.parse("2020-04-15T23:00:00+0000",
            DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
    System.out.println(dateTime1.toZonedDateTime());

Я получаю вывод как 2020-04-15T23: 00Z, но мне нужно как 2020-04- 15T23: 00: 00Z с секундами, в конце которых выполняется обрезка.

Ответы [ 2 ]

7 голосов
/ 18 апреля 2020
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .appendPattern("XX")
            .toFormatter();
    String str = "2020-04-15T23:00:00+0000";
    OffsetDateTime dateTime = OffsetDateTime.parse(str, formatter);
    System.out.println(dateTime);

Вывод:

2020-04-15T23: 00Z

Поскольку ваша входная строка содержит смещение, +0000 и часовой пояс отсутствует, предпочитайте представлять дату и время в виде OffsetDateTime, а не ZonedDateTime (если у вас есть определенные c причины для необходимости ZonedDateTime, просто используйте этот класс вместо этого в приведенном выше коде, он тоже будет работать ).

Я предпочитаю использовать встроенные средства форматирования вместо написания собственной строки шаблона формата. Только для смещения я использую шаблон формата XX (есть и другие шаблоны, которые тоже будут работать).

Я получаю вывод как 2020-04-15T23: 00Z, но мне нужен как 2020 -04-15T23: 00: 00Z с секундами, в конце которых это обрезка.

Скорее всего, нет. Формат ISO 8601, а в ISO 8601 секунды необязательны, когда они равны 0. OffsetDateTime или ZonedDateTime имеют полную точность (даже наносекунд). Пропуск (то, что вы назвали триммингом) происходит только в выходных данных, полученных методом toString объекта. Если вам нужен формат ISO 8601 для какого-либо другого API или другой системы, вариант без секунд также должен работать.

Если вам нужен определенный формат, используйте второй DateTimeFormatter для форматирования в строку в необходимого формата.

Что не так в вашем коде?

Марк Роттвил уже сказал: ISO 8601 не допускает пробела между временем и смещением UT C. Или, наоборот, когда в строке шаблона формата вы ставите пробел между ss и Z, при разборе потребуется пробел в проанализированной строке. Поскольку пробела не было, синтаксический анализ не удался.

Ссылки

1 голос
/ 18 апреля 2020

Вы можете конвертировать, как показано ниже, он поддерживает все следующие форматы ввода

"2012-10-01T19:30:00+0200"
"2012-10-01T19:30:00+02" 
"2012-10-01T19:30:00+02:00"
"2012-10-01T19:30:00Z" 

Кодовая часть

        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[XXX][XX][X]");


        OffsetDateTime osdt1 = OffsetDateTime.parse("2020-04-15T23:00:01+0000", dtf1);
        OffsetDateTime osdt2 = OffsetDateTime.parse("2020-04-15T23:00:43+0900", dtf1);
        OffsetDateTime osdt3 = OffsetDateTime.parse("2020-04-15T23:00:00+0000", dtf1);
        OffsetDateTime osdt4 = OffsetDateTime.parse("2020-04-15T23:00:00+0900", dtf1);
        System.out.println("2020-04-15T23:00:01+0000 --> " + osdt1.toString());
        System.out.println("2020-04-15T23:00:43+0900 --> " + osdt2.toString());
        System.out.println("2020-04-15T23:00:00+0000 --> " + osdt3.toString());
        System.out.println("2020-04-15T23:00:00+0900 --> " + osdt4.toString());

        System.out.println("\n");

        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
        System.out.println("2020-04-15T23:00:01+0000 --> " + dtf2.format(osdt1));
        System.out.println("2020-04-15T23:00:43+0900 --> " + dtf2.format(osdt2));
        System.out.println("2020-04-15T23:00:00+0000 --> " + dtf2.format(osdt3));
        System.out.println("2020-04-15T23:00:00+0900 --> " + dtf2.format(osdt4));

Вывод вышеуказанной части

2020-04-15T23:00:01+0000 --> 2020-04-15T23:00:01Z
2020-04-15T23:00:43+0900 --> 2020-04-15T23:00:43+09:00
2020-04-15T23:00:00+0000 --> 2020-04-15T23:00Z
2020-04-15T23:00:00+0900 --> 2020-04-15T23:00+09:00


2020-04-15T23:00:01+0000 --> 2020-04-15T23:00:01+0000
2020-04-15T23:00:43+0900 --> 2020-04-15T23:00:43+0900
2020-04-15T23:00:00+0000 --> 2020-04-15T23:00:00+0000
2020-04-15T23:00:00+0900 --> 2020-04-15T23:00:00+0900
...