tl; dr
El enfoque moderno utiliza las clases java.time .
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 las clases java.time. Las antiguas clases de fecha y hora, como Calendar
han demostrado ser mal diseñadas, confusas y problemáticas.
Defina un formateador personalizado para que coincida con su entrada de cadena.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
Parse como a 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 consultar los números de año y mes si es necesario.
int year = ym.getYear();
int month = ym.getMonthValue();
Pero el toString
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 mar 14 16:02:37 GMT 2011
zdt: 2011-03-14T16: 02: 37Z [GMT]
ym: 2011-03
Código en vivo
Vea este código ejecutándose en IdeOne.com .
Conversión
Si debe tener un Calendar
objeto, puede convertirlo a GregorianCalendar
usando nuevos métodos agregados a las clases anteriores.
GregorianCalendar gc = GregorianCalendar.from( zdt );
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date
, Calendar
, ySimpleDateFormat
.
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 posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más .