parse - Patrón Java SimpleDateFormat para las fechas W3C XML con zona horaria
simpledateformat timezone (9)
¿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);
}
};
Esta pregunta ya tiene una respuesta aquí:
- Zona horaria de Java al analizar DateFormat 7 respuestas
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?
Con respecto a SimpleDateFormat, ya ha mencionado los patrones de formato que están disponibles y están definidos en: docs.oracle.com/javase/7/docs/api/java/text/…
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));
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
.
La mejor manera es usar Joda''s
org.joda.time.format.ISODateTimeFormat
Saludos,
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. :)
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();
Puedes probar algo como:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssz");
Date date = df.parse(stringDate.replaceAll("//+", "GMT+"));
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");
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;
}