ТЛ; др
Современный подход использует классы 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
Избегайте устаревших классов даты и времени
Современный способ - с классами java.time. Старые классы даты и времени, такие как Calendar
плохо продуманные, запутанные и хлопотные.
Определите пользовательский форматер, чтобы соответствовать вашему вводу строки.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
Разобрать как ZonedDateTime
.
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
Вы заинтересованы в году и месяце. Классы java.time включают YearMonth
класс для этой цели.
YearMonth ym = YearMonth.from( zdt );
При необходимости вы можете опросить номера года и месяца.
int year = ym.getYear();
int month = ym.getMonthValue();
Но toString
метод генерирует строку в стандартном формате ISO 8601 .
String output = ym.toString();
Положите все это вместе.
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();
Дамп на консоль.
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
вход: пн мар 14 16:02:37 GMT 2011
zdt: 2011-03-14T16: 02: 37Z [GMT]
ym: 2011-03
Живой код
Посмотрите, как работает этот код на IdeOne.com .
преобразование
Если у вас должен быть Calendar
объект, вы можете преобразовать его, GregorianCalendar
используя новые методы, добавленные к старым классам.
GregorianCalendar gc = GregorianCalendar.from( zdt );
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на java.time.
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где взять классы java.time?
- Java SE 8 и SE 9 и позже
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .