Patrón Java SimpleDateFormat para las fechas W3C XML con zona horaria

Estoy tratando de analizar una fecha de esquema XML del W3C como la siguiente

"2012-05-15T07:08:09+03:00" 

que cumple con la norma ISO 8601 de la especificación WITC XML Schema dateTime .

En la fecha anterior, el identificador de zona horaria es "+03:00" , pero aparentemente no existe un patrón SimpleDateFormat para representarlo.

Si la zona horaria fuera "+0300" , entonces Z (mayúscula) sería aplicable y el patrón SimpleDateFormat sería

 yyyy-MM-dd'T'HH:mm:ssZ 

Del mismo modo, si la zona horaria fuera "GMT+03:00" , entonces z (minúscula) sería aplicable y el patrón SimpleDateFormat sería

 yyyy-MM-dd'T'HH:mm:ssz 

( 'Z' mayúsculas también funciona, por cierto).

Entonces, ¿hay un patrón SimpleDateFormat o solución para representar la fecha anterior sin preprocesamiento de la cadena de fecha?

¿Qué tal algo así como:

 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"){ public Date parse(String source,ParsePosition pos) { return super.parse(source.replaceFirst(":(?=[0-9]{2}$)",""),pos); } }; 

Si usa Java 7+, este patrón debería funcionar ( X es para la zona horaria ISO 8601):

 SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); 

Hmmm, ¿el formato de fecha parece el formato de tipo de datos de fecha y hora XML? Si se trata de formato de tipo de datos de fecha y hora XML, puede usar javax.xml.datatype.DatatypeFactory para crear XMLGregorianCalendar

 DatatypeFactory .newInstance() .newXMLGregorianCalendar("2012-05-15T07:08:09+03:00"); 

La llamada anterior devuelve la instancia de XMLGregorianCalendar , puede usar el objeto para convertir a otros objetos Java datetime como GregorianCalendar .

No, no hay ninguna solución para hacer que SimpleDateFormat comprenda este formato sin preprocesar la cadena (por ejemplo, eliminando : de la cadena). (editar: excepto si está utilizando Java 7 o más reciente según lo señalado por assylias).

Parece que está intentando analizar cadenas en el formato XML estándar para fechas y horas (ISO 8601). Recomendaría usar la biblioteca Joda Time que tiene soporte para este formato .

Si no puede o no quiere utilizar Joda Time por alguna razón, puede usar las clases del paquete javax.xml.datatype para analizar y formatear las marcas de tiempo en este formato. Por ejemplo:

 DatatypeFactory factory = DatatypeFactory.newInstance(); // Parses a string in ISO 8601 format to an XMLGregorianCalendar XMLGregorianCalendar xmlCal = factory.newXMLGregorianCalendar("2012-05-16T10:39:00+03:00"); // Convert it to a regular java.util.Calendar Calendar cal = xmlCal.toGregorianCalendar(); 

utilice Apache commons DateUtils con posibles patrones. Ex:

 private static final String[] DATE_FORMATS = new String[] { "yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ssz", "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-ddz", "yyyy-MM-ddZ" }; public Date parse(String date) { Date parsedDate = null; try { parsedDate = DateUtils.parseDate(date, DATE_FORMATS); } catch (ParseException e) { logger.error("dates should be in valid format" + e); return null; } return parsedDate; } 

La mejor manera es usar Joda’s

 org.joda.time.format.ISODateTimeFormat 

Saludos,

Con respecto a SimpleDateFormat, ya ha mencionado los patrones de formato que están disponibles y están definidos en: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Si desea hacer más con su Fecha, GregorianCalendar le brinda más opciones, por ejemplo:

 TimeZone zone = TimeZone.getTimeZone(TimeZone.getTimeZone("GMT-8").getID()); GregorianCalendar calendar = new GregorianCalendar(zone); calendar.setTime(new Date(SomeDate)); 

Puedes probar algo como:

 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); Date date = df.parse(stringDate.replaceAll("\\+", "GMT+")); 

No estoy muy seguro de si esto funcionará para usted o no. Pero aquí el código que he intentado al convertir la fecha de una zona horaria a otra zona horaria. Puede que parte del código pueda ayudarlo.

 public Date convertToUserTimezone(long dateToConvert, String timezoneOffset){ java.text.DateFormat format = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);/*new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*/ // java.util.Calendar cal = Calendar.getInstance(new // SimpleTimeZone(0, "GMT+05:30")); TimeZone gmtTime = TimeZone.getTimeZone("GMT"+timezoneOffset); format.setTimeZone(gmtTime); java.util.Date date1 = new Date(format.format(new Date(dateToConvert))); return date1; } 

Espero que esto te ayude. Aclamaciones. 🙂