Saltar al contenido

Convertir cadena en objeto de calendario en Java

Solución:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done

nota: establecer Locale según su entorno / requisito


Ver también

  • Javadoc

tl; dr

El enfoque moderno utiliza el java.time clases.

YearMonth.from(
    ZonedDateTime.parse( 
        "Mon Mar 14 16:02:37 GMT 2011" , 
        DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
     )
).toString()

2011-03

Evite las clases de fecha y hora heredadas

La forma moderna es con clases java.time. Las antiguas clases de fecha y hora como Calendar han demostrado estar mal diseñados, ser confusos y problemáticos.

Defina un formateador personalizado para que coincida con la entrada de su cadena.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );

Analizar como ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

Te interesa el año y el mes. Las clases java.time incluyen YearMonth clase para ese propósito.

YearMonth ym = YearMonth.from( zdt );

Puede interrogar por los números de año y mes si es necesario.

int year = ym.getYear();
int month = ym.getMonthValue();

Pero el toString El método genera una cadena en formato estándar ISO 8601.

String output = ym.toString();

Pon todo esto junto.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();

Volcado a la consola.

System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );

entrada: lun 14 de marzo 16:02:37 GMT 2011

zdt: 2011-03-14T16: 02: 37Z[GMT]

año: 2011-03

Código en vivo

Vea este código ejecutándose en IdeOne.com.

Conversión

Si tu debe tener un Calendar objeto, puede convertirlo en un GregorianCalendar utilizando nuevos métodos agregados a las clases antiguas.

GregorianCalendar gc = GregorianCalendar.from( zdt );

Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date, CalendarY SimpleDateFormat.

El proyecto Joda-Time, ahora en modo de mantenimiento, aconseja la migración a java.time.

Para obtener más información, consulte el tutorial de Oracle. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y después

    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas funciones y correcciones menores.
  • Java SE 6 y SE 7

    • Gran parte de la funcionalidad de java.time está retroportada a Java 6 y 7 en ThreeTen-Backport.
  • Androide

    • los ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver Cómo utilizar….

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

Bueno, creo que sería una mala idea replicar el código que ya está presente en clases como SimpleDateFormat.

Por otro lado, personalmente sugiero evitar Calendar y Date completamente si puede, y usando Joda Time en su lugar, como una API de fecha y hora mucho mejor diseñada. Por ejemplo, debe tener en cuenta que SimpleDateFormat es no seguro para subprocesos, por lo que necesita subprocesos locales, sincronización o una nueva instancia cada vez que lo use. Analizadores y formateadores Joda están a salvo de amenazas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *