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
, Calendar
Y 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.