Tl;dr
Einfach, mit java.time .
Für den 3. Donnerstag:
LocalDate.now().with( // Get today's date, then adjust.
TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.THURSDAY ) // Define adjuster to move to third Thursday of same month.
) // Instantiates another `LocalDate` object (java.time uses immutable objects).
java.time
Die lästigen alten Date-Time-Klassen, die mit den frühesten Versionen von Java mitgeliefert wurden, sind nun veraltet und durch die java.time-Klassen ersetzt worden.
El LocalDate
stellt einen reinen Datumswert ohne Uhrzeit und ohne Zeitzone dar.
LocalDate ld = LocalDate.of( 2018 , Month.FEBRUARY , 17 ) ;
Für jede LocalDate
können Sie das ordinale Auftreten eines Wochentags innerhalb desselben Monats einstellen (z. B. dritter Donnerstag, zweiter Dienstag usw.). Geben Sie den Wochentag an mit DayOfWeek
enum.
Verwenden Sie für die Einstellung einen TemporalAdjuster
Implementierungen, die in der TemporalAdjusters
classe.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.THURSDAY ) ; // Third-Thursday.
Wenden Sie diesen Einsteller auf jede LocalDate
und erzeugt eine weitere LocalDate
Objekt.
LocalDate thirdThursday = ld.with( thirdThursdayAdjuster ) ;
so etwas wie einen unendlichen Iterator daraus machen (.next() würde das nächste passende Datum zurückgeben
Bewegen Sie sich einfach von einem LocalDate
zum anderen. Sie könnten anrufen LocalDate::addMonths
. Oder, wenn Sie einen Monat auf einmal behandeln, verwenden Sie die YearMonth
classe.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.THURSDAY ) ; // Third-Thursday.
List<LocalDate> dozenThirdThursdays = new ArrayList<>( 12 ) ;
YearMonth start = YearMonth.of( 2018 , Month.MARCH ) ;
for( int i = 1 ; i <= 12 ; i ++ ) {
YearMonth ym = start.plusMonths( i ) ;
LocalDate firstOfMonth = ym.atDay( 1 ) ;
LocalDate thirdThursday = firstOfMonth.with( thirdThursdayAdjuster ) ;
dozenThirdThursdays.add( thirdThursday ) ;
}
Über java.time
El java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
El Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.
Weitere Informationen finden Sie in der Oracle-Tutorial . Und suchen Sie auf Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 310 .
Wo erhält man die java.time-Klassen?
- Java SE 8 , Java SE 9 und später
- Eingebaut.
- Teil der Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
- Java SE 6 et Java SE 7
- Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert in DreiZehn-Backport .
- Android
- Spätere Versionen von Android bündeln Implementierungen der java.time-Klassen.
- Bei früheren Android-Versionen ist die DreiZehnABP Projekt passt sich an DreiZehn-Backport (siehe oben). Siehe Wie benutzt man ThreeTenABP .
El DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval
, YearWeek
, YearQuarter
et mehr .