tl; dr
Core concepto de código:
EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY)
.contains(
LocalDate.now(ZoneId.of("America/Montreal"))
.getDayOfWeek()
)
java.time
La forma moderna es con las clases java.time.
La enumeración DayOfWeek
proporciona siete objetos, de lunes a domingo.
La clase LocalDate
representa un valor de fecha solamente sin hora del día y sin zona horaria.
Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en Paris France es un nuevo día mientras aún está "ayer" en Montréal Québec.
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DayOfWeek dow = today.getDayOfWeek();
Defina el fin de semana como un conjunto de objetos DayOfWeek
. Tenga en cuenta que EnumSet
es una implementación especialmente rápida y con poca memoria de Set
diseñada para contener objetos Enum
como DayOfWeek
.
Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY);
Ahora podemos comprobar si hoy es un día laborable o un fin de semana.
Boolean todayIsWeekend = weekend.contains(dow);
La pregunta dice que queremos saltar al comienzo de la próxima semana si este es un fin de semana. Para hacer eso, use un TemporalAdjuster
que proporciona clases que pueden manipular objetos de fecha y hora. En java.time tenemos immutable objects. Esto significa que producimos nuevas instancias basadas en los valores dentro de un objeto existente en lugar de alterar ("mutar") el original. La clase TemporalAdjusters
(tenga en cuenta el plural 's') proporciona varias implementaciones útiles de TemporalAdjuster
incluyendo next(DayOfWeek)
.
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if(todayIsWeekend) {
startOfWeek = today.with(TemporalAdjusters.next(firstDayOfWeek));
} else {
startOfWeek = today.with(TemporalAdjusters.previousOrSame(firstDayOfWeek));
}
Nos suave de código largo de la semana en caso de que nuestra definición de fin de semana cambia nunca.
LocalDate ld = startOfWeek ;
int countDaysToPrint = (DayOfWeek.values().length - weekend.size());
for(int i = 1 ; i <= countDaysToPrint ; i++) {
System.out.println(ld);
// Set up the next loop.
ld = ld.plusDays(1);
}
Ver live code in IdeOne.com.
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 legacy, como java.util.Date
, Calendar
, & SimpleDateFormat
. El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a 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 y 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 SE 7
- Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
- Android
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
- Ver How to use….
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.
gracias por la respuesta! Si lo ejecuto, dice que el día de la semana es 2 (es domingo aquí). Así que lo puse para eso y el lunes comencé con 3 ... ¿es correcto? – Cristian
GRACIAS MUCHO HOMBRE !!!!! – Cristian
¿Quizás use 'dayOfWeek == Calendar.VIDIA' en lugar de 'dayOfWeek == 6', etc.? –