2011-01-09 13 views
20

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?¿Cómo comprobar si es sábado/domingo?

Aquí está mi código de trabajo hasta el momento (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 como he estado buscando la solución durante horas ...

Respuesta

23
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 linda puede reemplazar el if/then/else con

c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1); 

pero realmente quería algo fácil de entender y legible.

+0

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

+0

GRACIAS MUCHO HOMBRE !!!!! – Cristian

+6

¿Quizás use 'dayOfWeek == Calendar.VIDIA' en lugar de 'dayOfWeek == 6', etc.? –

7

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.

Cuestiones relacionadas