¿Cómo convierto 2010-12-15T16: 26: 49,841 a 08: 00 a una GregorianCalendar en Java? [duplicar]
-
10-10-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
Tengo una cita cadena "2010-12-15T16: 26: 49,841 a 08: 00" y tengo que convertirlo a un GregorianCalendar en Java. ¿Cómo se hace esto?
Solución de la respuesta de Jesper
Código para la solución con el tiempo joda:
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withOffsetParsed();
DateTime date = formatter.parseDateTime("2010-12-15T16:26:49.841-08:00");
Solución
Por desgracia, la clase SimpleDateFormat
estándar no puede manejar formato ISO 8601 muy bien. Específicamente, no se puede manejar la :
que está en la zona horaria de compensación al final.
Lo que puede hacer es quitar manualmente el :
de la zona horaria de desplazamiento, de manera que se obtiene una cadena que es similar al siguiente:
2010-12-15T16:26:49.841-0800
(Tenga en cuenta que la zona horaria es compensado -0800
en lugar de -08:00
). A continuación, puede analizar con SimpleDateFormat
con el formato yyyy-MM-dd'T'HH:mm:ss.SSSZ
.
Sin embargo, es mejor utilizar la popular biblioteca Joda-Time al tiempo de manejo y las fechas; es mucho mejor que el estándar de formato de fecha de Java API y el calendario clases y manijas ISO 8601 correctamente.
Otros consejos
Uso SimpleDateFormat, ver javadocs aquí:
A continuación, convertir la fecha al calendario. Echar un vistazo a un montón de ejemplos aquí:
Puede probar con este pedazo de código
DateTimeFormatter formatter =
DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();
Esto sin duda le dará el objeto gregoriano calendario
String dateTimeString="2010-12-15T16:26:49.841-08:00";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
DateTime dateTime = formatter.parseDateTime(dateTimeString);
GregorianCalendar cal = dateTime.toGregorianCalendar();
Las otras respuestas son correctas pero ahora anticuado. Utilizan molestos viejas clases ahora suplantado por el marco java.time.
Uso java.time
El cadena de entrada pasa a cumplir con ISO 8601 formato estándar. Por lo tanto no hay necesidad de especificar un patrón de formato que las clases java.time utilizan la norma ISO 8601 de forma predeterminada cuando se analizan / generación de cadenas.
La secuencia de la entrada incluye un desplazamiento-de-UTC, por lo que analizar sintácticamente como un OffsetDateTime
.
String input = "2010-12-15T16:26:49.841-08:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
Si usted tiene una zona horaria específica en mente, en lugar de un mero desplazamiento-de-UTC, que aplique.
ZoneId zoneId = ZoneId.of( "America/Los_Angele" );
ZonedDateTime zdt = odt.atZone( zoneId );
GregorianCalendar
Debe evitar las clases de fecha y hora viejos como GregorianCalendar
. Pero si debe interoperar con código antiguo aún no actualizado para java.time, puede convertir. Utilizar nuevos métodos añadidos a las antiguas clases para la conversión. Para obtener más información y un diagrama ingenioso, ver a mi Pregunta y respuesta .
Calendar cal = java.util.GregorianCalendar.from( zdt ); // Do such conversions out of java.time only if absolutely necessary.
Acerca de java.time
El java.time marco está construido en Java 8 y versiones posteriores. Estas clases sustituyen a las antiguas clases de fecha y hora molestos como java.util.Date
, .Calendar
, y java.text.SimpleDateFormat
.
El proyecto Joda-Time , ahora en el modo de mantenimiento , aconseja migración a java.time.
Para obtener más información, consulte la Oracle Tutorial . Y la búsqueda de desbordamiento de pila durante muchos ejemplos y explicaciones.
Gran parte de la funcionalidad de back-java.time está portado a Java 6 y 7 en ThreeTen-Backport y más adaptado a Android en ThreeTenABP .