ТЛ; др
Современный подход использует классы 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]
гм: 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
и more .