tl; dr
Fácil, con java.time.
Por tercera Jueves:
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
Las clases de fecha y hora viejas problemáticas que vienen con las primeras versiones de Java son ahora obsoletos, suplantado por las clases java.time.
La clase LocalDate
representa un valor de fecha solamente sin hora del día y sin zona horaria.
LocalDate ld = LocalDate.of(2018 , Month.FEBRUARY , 17) ;
Para cualquier LocalDate
, puede ajustar en la ocurrencia ordinal de un día de la semana dentro del mismo mes (por ejemplo: tercer jueves 2 martes, etc.). Especifique el día de la semana con DayOfWeek
enum.
Para realizar el ajuste, utilice una implementación TemporalAdjuster
que se encuentra en la clase TemporalAdjusters
.
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) ; // Third-Thursday.
aplicar ese ajuste para cualquier LocalDate
, produciendo otro objeto LocalDate
.
LocalDate thirdThursday = ld.with(thirdThursdayAdjuster) ;
algo así como un iterador infinita fuera de él (.Next() devolvería la próxima fecha a juego
Basta con pasar de una a otra LocalDate
. Se le podría llamar LocalDate::addMonths
.O si se trata de un mes a la vez, use la clase 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) ;
}
Sobre java.time
El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date
, Calendar
, & SimpleDateFormat
.
El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.
Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.
¿Dónde obtener las clases java.time?
- Java SE 8, Java SE 9, y más tarde
- incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
- Android
- Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
- Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….
El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
y more.
Me sacudiste la tarde, gracias amigo! –
Aunque no es importante en absoluto, solo quiero decir que este es el segundo iterador que he creado y que admite remove(); por lo general, he encontrado que es demasiado engorroso para admitirlo. – Esko