Recuperar la fecha del lunes de la semana actual

Tenemos una utilidad que funcionará cualquier día entre lunes y viernes. Actualizará una cierta cantidad de archivos dentro de una herramienta de gestión de contenido. La última fecha de modificación asociada con ese archivo debe ser la fecha del lunes de esa semana. Escribí el siguiente progtwig para recuperar la fecha del lunes de la semana actual. Pero todavía no estoy seguro de si esto funcionaría para todos los escenarios. ¿Alguien tiene una mejor solución?

Calendar c = Calendar.getInstance(); c.setTime(new Date()); System.out.println(c.get(Calendar.DAY_OF_MONTH)); System.out.println(c.get(Calendar.DAY_OF_WEEK)); int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2; c.set(Calendar.DAY_OF_MONTH,mondayNo); System.out.println("Date "+c.getTime()); 

    Recomiendo utilizar Joda Time en su lugar (para todo su trabajo de fecha / hora, no solo esto):

     // TODO: Consider time zones, calendars etc LocalDate now = new LocalDate(); LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY); System.out.println(monday); 

    Tenga en cuenta que, como lo hizo el lunes aquí, que es el primer día de la semana en Joda Time, siempre regresará un día anterior (o el mismo día). Si eligió el miércoles (por ejemplo), avanzaría al miércoles de lunes a martes. Siempre puede agregar o restar una semana si necesita “el próximo miércoles” o “el miércoles anterior”.

    EDITAR: si realmente quieres usar java.util.Date/Calendar, puedes usar:

     Calendar c = Calendar.getInstance(); c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Date " + c.getTime()); 

    Puede usar Calendar.setFirstDayOfWeek para indicar si una semana es de lunes a domingo o de domingo a sábado; Creo que establecer el día de la semana permanecerá dentro de la semana actual, pero pruébalo.

    tl; dr

     LocalDate previousMonday = LocalDate.now( ZoneId.of( "America/Montreal" ) ) .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ); 

    java.time

    Tanto la clase java.util.Calendar como la biblioteca Joda-Time han sido suplantadas por el marco java.time integrado en Java 8 y posterior. Vea el Tutorial de Oracle . Gran parte de la funcionalidad de java.time ha sido retransmitida a Java 6 y 7 en ThreeTen-Backport y adaptada a Android en ThreeTenABP .

    La clase java.time.LocalDate representa un valor de solo fecha sin hora del día y sin zona horaria.

    La determinación de la fecha de hoy requiere un huso horario, un ZoneId .

     ZoneId zoneId = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( zoneId ); 

    La interfaz TemporalAdjuster (ver Tutorial ) es una forma poderosa pero simple de manipular valores de fecha y hora. La clase TemporalAdjusters (observe el plural) implementa algunos ajustes muy útiles. Aquí usamos el previous( DayOfWeek) .

    El útil enum de DayOfWeek hace que sea fácil especificar un día de la semana.

     LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ); 

    Si hoy es lunes y desea usar hoy en lugar de hace una semana, llame a previousOrSame .


    Acerca de java.time

    El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas 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 las clases java.time .

    Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

    Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

    ¿Dónde obtener las clases de java.time?

    • Java SE 8 , Java SE 9 y posterior
      • Incorporado.
      • Parte de la API Java estándar con una implementación integrada.
      • Java 9 agrega algunas características y correcciones menores.
    • Java SE 6 y Java SE 7
      • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
    • Androide
      • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
      • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

    El proyecto ThreeTen-Extra amplía 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 más .

    Lo siguiente funcionará, incluidos los meses de embalaje:

     Calendar c = Calendar.getInstance(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setTime(new Date()); int today = c.get(Calendar.DAY_OF_WEEK); c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY); System.out.println("Date "+c.getTime()); 

    Sin embargo, si edita su solicitud un domingo (por ejemplo, el domingo 12 de febrero), la fecha será para el lunes siguiente. Según sus requisitos (la aplicación solo se ejecutará de lunes a viernes), esto no debería representar un problema.

    Como sugirió Jon, el método calendar.set funciona … Lo he probado tanto en el caso de un lunes en el mismo mes como en otro mes usando el siguiente fragmento:

     Calendar c = Calendar.getInstance(); //ensure the method works within current month c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Date " + c.getTime()); //go to the 1st week of february, in which monday was in january c.set(Calendar.DAY_OF_MONTH, 1); System.out.println("Date " + c.getTime()); //test that setting day_of_week to monday gives a date in january c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); System.out.println("Date " + c.getTime()); //same for tuesday c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); System.out.println("Date " + c.getTime()); 

    Los resultados:

     Date Mon Feb 13 10:29:41 CET 2012 Date Wed Feb 01 10:29:41 CET 2012 Date Mon Jan 30 10:29:41 CET 2012 Date Tue Jan 31 10:29:41 CET 2012 

    ¿Qué pasa con el uso de la biblioteca Joda Time … Eche un vistazo a esta respuesta …

    en caso de que no quieras usar Joda Time, puedes hacer esto para encontrar las semanas -> (funciona en Android)

     public static ArrayList getWeeks(int month) { ArrayList arrayListValues = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("MMMM d"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, month); int day = calendar.get(Calendar.DAY_OF_WEEK); while (day != 1) { calendar.add(Calendar.DATE, 1); day = calendar.get(Calendar.DAY_OF_WEEK); } calendar.add(Calendar.DATE, -14); String y1 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 6); String y2 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 1); arrayListValues.add(y1 + " - " + y2); y1 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 6); y2 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 1); arrayListValues.add(y1 + " - " + y2); for (int i = 0; i < 10; i++) { y1 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 6); y2 = sdf.format(calendar.getTime()); calendar.add(Calendar.DATE, 1); arrayListValues.add(y1 + " - " + y2); } return arrayListValues; } 

    No funcionará si la semana actual es el mes anterior … Por ejemplo, si hoy es viernes 1 de junio … Probablemente deberías usar el método de rollo …