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");
¿Fue útil?

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 .

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí como Interval, YearWeek, YearQuarter, y mucho más.

scroll top