Java / convertir ISO-8601 (2010-12-16T13: 33: 50.513852Z) al objeto Date

¿Cómo se analiza una cadena en formato ISO 8601 con tiempo zulú?

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

devoluciones

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

¿Qué significa algo así como el formato incorrecto, alguien tiene una pista de lo que está mal aquí?

tl; dr

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

java.time

Las clases más nuevas de java.time pueden manejar esta entrada de cadena.

La Z en el extremo es corta para Zulu y significa UTC , un desplazamiento de cero +00:00 .

Instant

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

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

Zona horaria

Es posible que desee aplicar un ZoneId zona ZoneId para obtener un ZonedDateTime . Buscar desbordamiento de stack para conocer los nombres de clase para obtener más información, así como para las clases OffsetDateTime y DateTimeFormatter .

Conversión

Lo mejor es evitar la vieja clase heredada problemática de java.util.Date . Pero si insiste, llame a los nuevos métodos de conversión agregados a las clases antiguas.

 java.util.Date date = java.util.Date.from( instant ); 

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
    • Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

Funciona para mí try ide en línea

La salida es:

 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] 

El código que publicaste funciona bien en mi jre. Probablemente haya definido su propio DatatypeConverter (¡con textos de excepción alemanes …!) Y este DatatypeConverter específico no puede analizar esta fecha.

Haga una búsqueda de código para este código: DatatypeConverter.setDatatypeConverter( – allí probablemente encontrará su implementación personalizada del “DatatypeConverterInterface” – que probablemente le guiará a su error.

Alternativamente, puede buscar weist ein falsches Format auf. (porque ese texto de excepción no es parte de la jre)

Viel Erfolg;)