Cómo obtener el primer / último día de una semana incompleta en Java

y gracias por leerme

Tengo un pequeño problema que es que necesito saber el primer / último día de una semana en un mes y un año, entonces:

public String getFirstDayOfWeekAndMonth(int year, int month, int week){
   Calendar weekCalendar = Calendar.getInstance();
   weekCalendar.clear();
   weekCalendar.set( Calendar.YEAR, year );
   weekCalendar.set( Calendar.MONTH, month-1); // zero-based
   weekCalendar.set( Calendar.WEEK_OF_YEAR, week );

   return... ?
}

Por ejemplo para el próximo calendario:

Month    Week     M   T   W   T   F   S   S           FirstDay    LastDay
          1               1   2   3   4   5              1           5
          2       6   7   8   9   10  11  12             6           12
  1       3       13  14  15  16  17  18  19             13          19
          4       20  21  22  23  24  25  26             20          26
          5       27  28  29  30                         27          30

          5                       1   2   3              1           3
          6       4   5   6   7   8   9   10             4           10
  2       7       11  12  13  14  15  16  17             11          17
          8       18  19  20  21  22  23  24             18          24
          9       25  26  27  28                         25          28

          9                       1   2   3              1           3
  3       10      4   5   6   7   8   9   10             4           10
                     ...

Tengo problemas con las semanas que son en 2 meses (en los ejemplos 5 y 9). ¿Usted me podría ayudar por favor?

Muchas gracias.

Respuesta 1

Recomiendo usar la brillante biblioteca Joda-Time para todas sus necesidades de tiempo (que también recomiendo hacer una importación estándar en todos sus proyectos).

Con eso, una solución (no muy limpia, pero que funciona) sería esta:

public String getFirstDayOfWeekAndMonth(int year, int month, int week) {
    DateTime firstDayOfMonth = new DateTime(year, month, 1, 0, 0, 0, 1);
    DateTime lastDayOfMonth = new DateTime(year, month, firstDayOfMonth.dayOfMonth().getMaximumValueOverall(), 0, 0, 0, 1);

    // european style (MON - SUN)
    DateTime firstOfWeek = new DateTime(year, 1, 1, 0, 0, 0, 1).plusWeeks(week - 1).withDayOfWeek(1);
    DateTime lastOfWeek = firstOfWeek.withDayOfWeek(7);

    int firstDay;
    int lastDay;
    if(firstOfWeek.isBefore(firstDayOfMonth))
        firstDay = firstDayOfMonth.getDayOfMonth();
    else
        firstDay = firstOfWeek.getDayOfMonth();

    if(lastOfWeek.isAfter(lastDayOfMonth))
        lastDay = lastDayOfMonth.getDayOfMonth();
    else
        lastDay = lastOfWeek.getDayOfMonth();

    String returner = String.format("%d - %d", firstDay, lastDay);

    return returner;
}

No entiendo por qué querrías devolver una Cadena de tu método, pero supongo que tienes una razón. Simplemente asumí un formato, por supuesto, puede cambiarlo si lo desea.

Respuesta: 2

Tal vez una simple prueba lógica?

Para el primer día de la semana:

If (resultDate.month < input.month){
     resultDate = firstDayOf(input.month);
}

y para el último día de la semana

If (resultDate.month > input.month){
    resultDate = lastDayOf(input.month);
}
Respuesta: 3

Quiero implementar una política de equilibrio de carga en HornetQ que depende de las direcciones IP de los nodos. Por ejemplo, si un nodo específico está disponible, conéctelo, de lo contrario, conéctese a un nodo aleatorio ...

¿Es posible configurar Doxygen para excluir mi getter y setter? Estamos usando beans Extensivly, y para la documentación interna realmente no hay necesidad de tener visibles el getter y el setter ...

Estoy creando una aplicación para Android y me gustaría automatizar el empaquetado del código fuente (ya sea en tarballs o archivos zip). Ahora, obviamente, podría hacer esto con un script de shell que se cierra ...

Tengo un formateador personalizado ... // nuestra zona horaria predeterminada es la de la máquina local. privado estático final DateTimeZone LOCAL_TZ = DateTimeZone.getDefault (); // formato de fecha (es decir, marca de tiempo) es aaaa-MM -...