java - viajes - vuelos baratos
¿Cómo comprobar si es sábado/domingo? (2)
tl; dr
Concepto de código base:
EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) // Instantiate a n implementation of `Set` highly optimized in both memory usage and execution speed for collecting enum objects.
.contains( // Ask if our target `DayOfWeek` enum object is in our `Set`.
LocalDate.now( ZoneId.of( "America/Montreal" ) ) // Determine today’s date as seen by the people of a particular region (time zone).
.getDayOfWeek() // Determine the `DayOfWeek` enum constant representing the day-of-week of this date.
)
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 solo fecha sin hora del día y sin zona horaria.
Una zona horaria es crucial para determinar una fecha. Para un momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos pocos minutos después de la medianoche en París, Francia es un nuevo día, mientras que todavía es "ayer" en Montreal 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 probar 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 esto 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 objetos inmutables . 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
incluidas las next( DayOfWeek )
.
DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;
LocalDate startOfWeek = null ;
if( todayIsWeekend ) {
startOfWeek = today.with( TemporalAdjusters.next( firstDayOfWeek ) );
} else {
startOfWeek = today.with( TemporalAdjusters.previousOrSame( firstDayOfWeek ) );
}
Codificamos la duración de la semana en caso de que alguna vez cambie nuestra definición de fin de semana.
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 código en vivo en IdeOne.com .
Acerca de java.time
El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date
, Calendar
, y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time.
Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
- Java SE 8 y SE 9 y posteriores
- Incorporado.
- Parte de la API de Java estándar con una implementación en paquete.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
- Android
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
- Ver cómo usar ...
El proyecto ThreeTen-Extra extiende 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 .
Lo que hace este código es imprimir las fechas de la semana actual de lunes a viernes. Funciona bien, pero quiero preguntar algo más: si hoy es sábado o domingo, quiero que se muestre la próxima semana. ¿Cómo puedo hacer eso?
Aquí está mi código de trabajo hasta ahora (gracias a StackOverflow!):
// Get calendar set to current date and time
Calendar c = Calendar.getInstance();
// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// Print dates of the current week starting on Monday to Friday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i <= 4; i++) {
System.out.println(df.format(c.getTime()));
c.add(Calendar.DATE, 1);
}
¡Muchas gracias! Realmente lo aprecio porque he estado buscando la solución durante horas ...
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
// Set the calendar to monday of the current week
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
// Print dates of the current week starting on Monday to Friday
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy");
for (int i = 0; i <= 10; i++) {
System.out.println(df.format(c.getTime()));
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.FRIDAY) { // If it''s Friday so skip to Monday
c.add(Calendar.DATE, 3);
} else if (dayOfWeek == Calendar.SATURDAY) { // If it''s Saturday skip to Monday
c.add(Calendar.DATE, 2);
} else {
c.add(Calendar.DATE, 1);
}
// As Cute as a ZuZu pet.
//c.add(Calendar.DATE, dayOfWeek > Calendar.THURSDAY ? (9 - dayOfWeek) : 1);
}
}
Salida
Mon 03/01/2011
Tue 04/01/2011
Wed 05/01/2011
Thu 06/01/2011
Fri 07/01/2011
Mon 10/01/2011
Tue 11/01/2011
Wed 12/01/2011
Thu 13/01/2011
Fri 14/01/2011
Mon 17/01/2011
Si quieres ser lindo puedes reemplazar el if / then / else con
c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1);
Pero realmente quería algo comprensible y legible.