java - xmlgregoriancalendar formatting example
Fecha de cadena a xmlgregoriancalendar conversión (4)
tl; dr
LocalDate.parse( "2014-01-07" )
.atStartOfDay( ZoneId.of( "America/Montreal" ) )
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )
2014-01-07 00:00:00
Fecha-hora! = Cadena
No confunda un valor de fecha y hora con su representación textual. Analizamos cadenas para obtener un objeto de fecha y hora, y le pedimos al objeto de fecha y hora que genere una cadena para representar su valor. El objeto de fecha y hora no tiene ''formato'', solo las cadenas tienen un formato.
Así que cambia tu forma de pensar en dos modos separados: modelo y presentación. Determine el valor de fecha que tiene en mente, aplicando la zona horaria adecuada, como modelo. Cuando necesite mostrar ese valor, genere una cadena en un formato particular como lo espera el usuario.
Evitar las clases de fecha y hora heredadas
La Pregunta y otras Respuestas utilizan todas las antiguas y problemáticas clases de fecha y hora ahora suplantadas por las clases de java.time.
ISO 8601
Su cadena de entrada "2014-01-07"
está en formato estándar ISO 8601 .
La T
en el medio separa la parte de la fecha de la parte de la hora.
La Z
en el final es la abreviatura de Zulu y significa UTC .
Afortunadamente, las clases java.time utilizan los formatos ISO 8601 de forma predeterminada al analizar / generar cadenas. Así que no hay necesidad de especificar un patrón de formato.
LocalDate
La clase LocalDate
representa un valor de solo fecha sin hora del día y sin zona horaria.
LocalDate ld = LocalDate.parse( "2014-01-07" ) ;
ld.toString (): 2014-01-07
Inicio del día ZonedDateTime
Si desea ver el primer momento de ese día, especifique una zona horaria ZoneId
para obtener un momento en la línea de tiempo, un ZonedDateTime
. La zona horaria es crucial porque la fecha varía alrededor del globo por zona. Unos pocos minutos después de la medianoche en París, Francia es un nuevo día, mientras que todavía es "ayer" en Montreal Quebec.
Nunca asumas que el día comienza a las 00:00:00. Las anomalías, como el horario de verano (DST, por sus siglas en inglés), significan que el día puede comenzar en otro momento del día, como 01:00:00. Deja que java.time determine el primer momento.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString (): 2014-01-07T00: 00: 00Z
Para el formato deseado, genere una cadena utilizando el formateador predefinido DateTimeFormatter.ISO_LOCAL_DATE_TIME
y luego reemplace la T
en el medio con un ESPACIO.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " ) ;
2014-01-07 00:00:00
Acerca de java.time
El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases 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 busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 y posteriores
- Incorporado.
- Parte de la API de Java estándar con una implementación en paquete.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
- Android
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
- Vea Cómo usar ThreeTenABP… .
El proyecto ThreeTen-Extra extiende 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 .
He escrito esta función:
public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{
XMLGregorianCalendar xmlCalender=null;
GregorianCalendar calender = new GregorianCalendar();
calender.setTime(Util.stringToJavaDate(date));
xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
return xmlCalender;
}
public static Date stringToJavaDate(String sDate) throws OmniException{
Date date=null;
date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate);
return date;
}
Cuando estoy pasando la fecha como "2014-01-07"
fecha de salida como 2014-01-06T18:30:00:000Z
en 2014-01-06T18:30:00:000Z
me estoy yendo mal? también qué hacer si quiero obtener solo 2014-01-06T18:30:00
y 2014-01-06T18:30:00Z
Cualquier ayuda es apreciada
Encontré la solución como se muestra a continuación ... publicándola, ya que podría ayudar a alguien más también
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = format.parse("2014-04-24 11:15:00");
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
System.out.println(xmlGregCal);
Salida:
2014-04-24T11: 15: 00.000 + 02: 00
Para mi la solución más elegante es esta:
XMLGregorianCalendar result = DatatypeFactory.newInstance()
.newXMLGregorianCalendar("2014-01-07");
Utilizando Java 8.
Ejemplo extendido:
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());
Esto imprime:
7
1
2014
GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);