una semana obtener numero fecha actual java date calendar dayofweek

semana - obtener fecha actual calendar java



Recuperar la fecha del lunes de la semana actual (7)

Tenemos una utilidad que funcionará cualquier día entre lunes y viernes. Actualizará una cierta cantidad de archivos dentro de una herramienta de administració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 programa 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 solución mejor?

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());


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 java.time posteriores. Ver Tutorial de Oracle . Gran parte de la funcionalidad de java.time se ha adaptado a Java 6 y 7 en ThreeTen-Backport y se ha adaptado a Android en ThreeTenABP .

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

Determinar la fecha de hoy requiere una zona horaria, 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 los valores de fecha y hora. La clase TemporalAdjusters (note el plural) implementa algunos ajustes muy útiles. Aquí utilizamos el previous( DayOfWeek) .

La práctica enumeración 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 quiere 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 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 las clases java.time .

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

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cadenas, no se necesitan clases java.sql.* .

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java 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 Java SE 7
    • Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .

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 .


¿Qué hay de usar la biblioteca de Joda Time ? Echa un vistazo a esta answer ...


Como sugirió Jon, el método calendar.set funciona ... Lo he probado en el caso de un lunes en el mismo mes y en otro mes utilizando el siguiente fragmento de código:

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


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

public static ArrayList<String> getWeeks(int month) { ArrayList<String> 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; }


Lo siguiente funcionará, incluyendo meses de envoltura:

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 (p. Ej., Domingo 12 de febrero), la fecha será el lunes siguiente. Según sus requisitos (la aplicación solo se ejecutará de lunes a viernes), esto no debería plantear un problema.


No funcionará si el lunes de la semana de las corrientes es el mes anterior ... Por ejemplo, si hoy es viernes 1 de junio ... Probablemente prefiera usar el método de roll ...


Recomendaría encarecidamente usar Joda Time (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 ha usado el lunes aquí, que es el primer día de la semana en Joda Time, siempre volverá un día anterior (o el mismo día). Si eligió el miércoles (por ejemplo), entonces avanzaría al miércoles de lunes o martes. Siempre puede agregar o restar una semana si necesita "el próximo miércoles" o "el miércoles anterior".

EDITAR: Si realmente desea usar java.util.Date/Calendar, puede 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 configurar el día de la semana se mantendrá dentro de la semana actual, pero pruébelo.