2011-10-06 10 views
5

Estoy tratando de analizar la cadena de fecha y hora con SimpleDateFormat.parse() pero sigo recibiendo excepciones de fecha inusuables.SimpleDateFormat Excepción de "fecha no utilizable"

Aquí es el formato de fecha que estoy tratando de analizar: 2011-10-06T12:00:00-08:00

Aquí está el código que estoy utilizando:

try { 
    String dateStr = "2011-10-06T12:00:00-08:00"; 
    SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
    SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy"); 
    Date date = dateParser.parse(dateStr); 
    System.out.println(dateFormatter.format(date));   
} catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 

que devuelve este error: java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

Por lo que yo sé esta es la forma correcta de usar la clase SimpleDateFormat, pero no domino Java así que podría estar equivocado. ¿Alguien sabe cuál es mi problema?

Respuesta

10

La zona horaria debe ser GMT-08: 00 o -0800 (como dijo Madcore Tom). Ver Java docs.

En Java 7 puede utilizar "aaaa-MM-dd'T'HH: mm: SSX"

+1

La opción 'X' es lo que estaba buscando. Estaba leyendo los documentos de Java 6. Gracias – Wade

+0

Por lo demás, no java7, puede intentar usar el 'javax.xml.bind.DatatypeConverter.parseDateTime (date)' y puede encontrar más información aquí en este blog http://ta.cnci.org/java -blogs/236-convert-date –

0

intento con

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
+0

Recibí los mismos resultados – Wade

+0

Eso analiza bien para mí, ¿en qué entorno está ejecutando esto? – Rob

+0

Java 7 en Windows 7 máquina – Wade

10

creo que no va a analizar SimpleDateFormat zonas horarias con dos puntos en ellos (-08: 00). Debería poder analizar la fecha 2011-10-06T12:00:00-0800.

Algunas manipulaciones simples de cadenas deberían ayudarlo a deshacerse del colon.

+0

Sí, ese parece ser el problema . Gracias por tu ayuda. – Wade

-1

Me gustaría recomendar encarecidamente el uso de JodaTime para este tipo de cosas.

Está tratando de analizar un formato de fecha ISO, y Joda lo hace "de fábrica" ​​y le ofrecerá muchos otros beneficios también.

Hace mucho tiempo desistí de intentar obtener las clases de datos JDK estándar para hacer cosas útiles.

+1

¿me importaría publicar algunos ejemplos de cómo usar el tiempo JODA para resolver este problema de análisis sintáctico? – Saurabh

+0

¿Son esos "muchos" beneficios? Entre otras cosas, también introducirá excepciones que intentan analizar las fechas cuando ocurre el horario de verano. –

+0

FYI, el proyecto [Joda-Time] (http://www.joda.org/joda-time/) está ahora en [modo de mantenimiento] (https://en.wikipedia.org/wiki/Maintenance_mode), con el equipo recomienda la migración a las clases [java.time] (http://docs.oracle.com/javase/9/docs/api/java/time/package-summary.html). Consulte [Tutorial de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

0

Para un formato de fecha como 2013-06-28T00:00:00+00:00, este código debería funcionar:

SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
0

Estoy seguro que la mayoría de ustedes sintió frustrado por el hecho de que SimpleDateFormat no puede manejar el formato ISO8601. Aquí está mi pequeño truco para resolver esta molestia.

Cree una lista del formato Know que sepa que usará para su aplicación y aplique SimpleDateFormat a la lista. Ahora, en su método formatDate(), sencillo tratar todo el formato y la trampa conocida la excepción, entonces, si todavía no tiene una fecha, sólo tiene que utilizar

Date d = javax.xml.bind.DatatypeConverter.parseDateTime("2013-06-28T00:00:00+00:00").getTime(); 
if (d == null) 
try { 
    SimpleDateFormater ... 
} 

probarlo y ver si ese trabajo. Para obtener más información Simple trick to convert Date format with timezone in Java!

1

Primero debe formatear el valor en "2011-10-06T12: 00: 00-08: 00".

Example: SimpleDateFormat dateParser = new SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ssZ"); 

Después, cree el formateo para la formatacción deseada. Ej: SimpleDateFormat fmt = new SimpleDateFormat ("dd/MM/yyyy HH: mm: ss");

y después del último para la fecha. Ej: Date date = dateParser.parse (dateFormat); e impresión de fecha formateada.

A continuación, un ejemplo completo.

String dataStr = "2011-10-06T12: 00: 00-08: 00"; 
SimpleDateFormat dataParser = new SimpleDateFormat ("dd/MM/yyyy HH: mm: ss", Locale.US); 
Date date; 
Try { 
date = dataParser.parse (dataStr); 
System.out.println (dateFormatter.format (date)); 

} cath (ParseException e) { 

} 
1

tl; dr

OffsetDateTime.parse("2011-10-06T12:00:00-08:00") 
    .format( 
     DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US) // Or Locale.CANADA_FRENCH and such. 
    ) 

Oct 6, 2011

java.time

El enfoque moderno utiliza los java.time clases que suplantan los legados de edad clases de fecha y hora problemáticos.

La cadena de entrada está en un formato que cumple con el estándar ISO 8106. Las clases java.time usan estos formatos estándar de forma predeterminada al analizar/generar cadenas. Entonces no es necesario especificar un patrón de formateo.

Analizar como OffsetDateTime porque sus cadenas de entrada incluyen un desplazamiento desde UTC pero no un huso horario.

OffsetDateTime odt = OffsetDateTime.parse("2011-10-06T12:00:00-08:00") ; 

odt.toString(): 2011-10-06T12:00-08:00

generar una cadena en el formato deseado. Deje java.time localizar automáticamente en lugar de patrones de formato de código duro.

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US); // Or Locale.CANADA_FRENCH and such. 
String output = odt.format(f); 

output: Oct 6, 2011

Cuando seralizing un valor de fecha y hora como texto, utilice la norma ISO 8601 formatos en lugar de un formato localizada.

String output = odt.toLocalDate().toString() ; 

2011-10-06


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

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

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….

El proyecto se extiende ThreeTen-Extra 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 more.

Cuestiones relacionadas