tl; dr
Nowoczesne podejście wykorzystuje klasy 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
Unikaj starszych klas daty i godziny
Współczesnym sposobem są klasy java.time. Stare klasy data-czas, takie jak Calendar
, okazały się źle zaprojektowane, zagmatwane i kłopotliwe.
Zdefiniuj niestandardowy program formatujący, aby dopasować dane wejściowe ciągu.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
Analizuj jako plik ZonedDateTime
.
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
Interesuje Cię rok i miesiąc. W tym celu klasy java.time zawierają YearMonth
klasy.
YearMonth ym = YearMonth.from( zdt );
W razie potrzeby możesz zapytać o numer roku i miesiąca.
int year = ym.getYear();
int month = ym.getMonthValue();
Ale toString
metoda generuje ciąg w standardowym formacie ISO 8601 .
String output = ym.toString();
Połącz to wszystko razem.
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();
Zrzuć na konsolę.
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
wejście: poniedziałek, 14 marca, 16:02:37 GMT 2011
zdt: 2011-03-14T16: 02: 37Z [GMT]
ym: 2011-03
Kod na żywo
Zobacz ten kod działający w IdeOne.com .
Konwersja
Jeśli musisz mieć Calendar
obiekt, możesz przekonwertować go na a GregorianCalendar
przy użyciu nowych metod dodanych do starych klas.
GregorianCalendar gc = GregorianCalendar.from( zdt );
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, i SimpleDateFormat
.
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do java.time.
Aby dowiedzieć się więcej, zobacz samouczek Oracle . Wyszukaj wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Skąd wziąć klasy java.time?
- Java SE 8 i SE 9 i nowsze
- Wbudowany.
- Część standardowego interfejsu API języka Java z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i SE 7
- Android
- Projekt ThreeTenABP dostosowuje ThreeTen-Backport (wspomniany powyżej) specjalnie dla Androida.
- Zobacz, jak używać… .
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval
, YearWeek
, YearQuarter
, i więcej .