tl; dr
Facile, con java.time.
Per Giovedi 3:
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
Le classi data-ora vecchi fastidiose in bundle con le prime versioni di Java sono ormai obsolete, soppiantato dalle classi java.time.
La classe LocalDate
rappresenta un valore di sola data senza ora del giorno e senza fuso orario.
LocalDate ld = LocalDate.of(2018 , Month.FEBRUARY , 17) ;
Per qualsiasi LocalDate
, è possibile regolare nel verificarsi ordinale di un giorno della settimana all'interno dello stesso mese (es: terzo Giovedi, 2 ° Martedì, etc.). Specificare il giorno della settimana utilizzando DayOfWeek
enum.
Per eseguire la regolazione, utilizzare le implementazioni TemporalAdjuster
trovate nella classe TemporalAdjusters
.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) ; // Third-Thursday.
applicare tale regolazione per ogni LocalDate
, producendo un altro oggetto LocalDate
.
LocalDate thirdThursday = ld.with(thirdThursdayAdjuster) ;
qualcosa di simile a un iteratore infinita fuori di esso (.Next() restituirebbe alla data successiva corrispondenza
semplicemente spostarsi da un LocalDate
ad un altro. Si potrebbe chiamare LocalDate::addMonths
.O se si tratta di un mese alla volta, utilizzare la classe YearMonth
.
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) ;
}
Chi java.time
Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy come java.util.Date
, Calendar
, & SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.
Dove ottenere le classi java.time?
- Java SE 8, Java SE 9, e più tardi
- incorporato.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- Java SE 6 e Java SE 7
- Molte delle funzionalità java.time è di back-porting per Java 6 .
- Android
- versioni successive di implementazioni fascio Android delle classi java.time.
- Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….
Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e more.
Hai scosso il mio pomeriggio - grazie amico! –
Anche se non è importante, voglio solo dire che questo è il secondo Iterator che abbia mai realizzato che supporti remove(), di solito ho trovato troppo ingombrante per supportarlo. – Esko