Java / преобразование ISO-8601 (2010-12-16T13: 33: 50.513852Z) в объект Date - PullRequest
3 голосов
/ 24 декабря 2010

Как проанализировать строку в формате ISO 8601 с указанием времени по зулу?

javax.xml.bind.DatatypeConverter.parseDateTime("2010-12-16T13:33:50.513852Z")

возвращает

IllegalArgumentException: '2010-12-16T13:33:50.513852Z' weist ein falsches Format auf.

Что означает что-то вроде неправильного формата, у когоподсказка, что здесь не так?

Ответы [ 3 ]

5 голосов
/ 17 октября 2016

tl; dr

Instant.parse( "2010-12-16T13:33:50.513852Z" )

java.time

Более новые классы java.time могут обрабатывать этот ввод строки.

Z на конце - это сокращение от Zulu и означает UTC , смещение нуля +00:00.

Instant

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби)).

Instant instant = Instant.parse( "2010-12-16T13:33:50.513852Z" );

Часовой пояс

Вы можете применить часовой пояс ZoneId, чтобы получить ZonedDateTime.Поиск переполнения стека для этих имен классов, чтобы узнать больше, а также для классов OffsetDateTime и DateTimeFormatter.

Преобразование

Лучше всего избегать неприятного старого унаследованного класса java.util.Date.Но, если вы настаиваете, вызовите новые методы преобразования, добавленные к старым классам.встроенный в Java 8 и позже.Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Где получить классы java.time?

  • Java SE 8 и SE 9 и более поздних версий
    • Встроенный,
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

1 голос
/ 24 декабря 2010

Это работает для меня, попробуйте ide онлайн

Вывод:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+00:00",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2010,MONTH=11,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=16,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=13,MINUTE=33,SECOND=50,MILLISECOND=513,ZONE_OFFSET=0,DST_OFFSET=0]
0 голосов
/ 24 декабря 2010

Код, который вы разместили, прекрасно работает в моей jre.Возможно, вы определили свой собственный DatatypeConverter (с немецкими текстами исключений ...!), И этот конкретный DatatypeConverter не может проанализировать эту дату.

Выполните поиск кода для этого кода: DatatypeConverter.setDatatypeConverter( - там вы, вероятно, найдете свою собственную реализацию"DatatypeConverterInterface" - который, вероятно, приведет вас к вашей ошибке.

В качестве альтернативы вы можете искать weist ein falsches Format auf. (потому что этот текст исключения не является частью jre)

Viel Erfolg;)

...