java - example - Cuál es la mejor forma de recuperar las fechas del último lunes y viernes
string to date java (4)
Lo único que veo mal es que de hecho estás probando el rango Mo-Fr, y no, como se dijo, recuperando dos días específicos. Sería más seguro probar el rango de Mo-Sa con límite superior exclusivo.
Necesito las fechas para el lunes y el viernes de la semana pasada. Para hacer esto, recibo la fecha del lunes de esta semana y restando 7 días. Esto me da la fecha del lunes de la semana pasada.
Para obtener la fecha del viernes, tengo que sumar 4. Esto me confundió un poco porque, por alguna razón, el primer día de la semana es el domingo y no el lunes aquí en el Reino Unido.
De todos modos, así es como obtengo las fechas.
// Get the dates for last MON & FRI
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DAY_OF_WEEK, -7);
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
// Get the date on Friday
cal.add(Calendar.DAY_OF_WEEK, 4);
cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,0);
Lo anterior funciona, pero estoy interesado si hay algún problema con la lógica. Es decir, funcionará para Februarys, años bisiestos, etc.
Siéntase libre de sugerir una mejor solución / enfoque.
Gracias
Todavía tienes el inicio de la semana configurado para el domingo, lo que significa que Calendar.MONDAY
un sábado es el lunes anterior, mientras que Calendar.MONDAY
un domingo es el día siguiente.
Lo que debe hacer es (de acuerdo con la forma en que lo desee de acuerdo con su comentario anterior) establecer el inicio de la semana para el lunes.
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DAY_OF_WEEK, -7);
...
Más allá de eso, y de que el último segundo del viernes no está incluido en el rango, su lógica parece sólida, y no debería tener problemas con los años bisiestos / los cambios del horario de verano, etc.
Nota: Para Java 8 y versiones superiores, por favor, eche un vistazo a la respuesta de Basil Bourque ( enlace ).
Java 8 introdujo una nueva API de tiempo / fecha que ofrece la mayor parte de la funcionalidad de Joda-Time.
Joda-Time ofrece métodos realmente buenos para problemas como ese.
Obtener las fechas para el lunes y el viernes de la semana pasada se vería así usando Joda Time:
DateTime today = DateTime.now();
DateTime sameDayLastWeek = today.minusWeeks(1);
DateTime mondayLastWeek = sameDayLastWeek.withDayOfWeek(DateTimeConstants.MONDAY);
DateTime fridayLastWeek = sameDayLastWeek.withDayOfWeek(DateTimeConstants.FRIDAY);
Puede crear objetos DateTime
partir de objetos java.util.Date
y viceversa, por lo que es fácil de usar con las fechas de Java.
Usando el código de arriba con la fecha
DateTime today = new DateTime("2012-09-30");
resultados en "2012-09-17" para el lunes y "2012-09-21" para el viernes, estableciendo la fecha para
DateTime tomorrow = new DateTime("2012-10-01");
resultados en "2012-09-24" para el lunes y "2012-09-28" para el viernes.
tl; dr
LocalDate previousMonday =
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ) ;
Evite las clases heredadas de fecha y hora
Las otras Respuestas usan las problemáticas y antiguas clases de fecha y hora ahora suplantadas por las preguntas de java.time.
LocalDate
La clase LocalDate
representa un valor de solo fecha sin hora del día y sin zona horaria.
Un huso horario 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 París, Francia es un nuevo día cuando aún está "ayer" en Montreal Québec .
ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );
TemporalAdjuster
La interfaz TemporalAdjuster
proporciona ajustes para pasar de un valor de fecha y hora a otro. Encuentre implementaciones prácticas en la clase TemporalAdjusters
(observe el plural ''s''). El ajustador previous
encuentra cualquier objeto especificado de la enumeración DayOfWeek
.
La pregunta no define exactamente "la semana pasada". ¿Últimos siete días? ¿Estándar de lunes a domingo? ¿Semana localizada, como domingo a sábado en los Estados Unidos? ¿La semana anterior a la semana de hoy o la semana parcial de hoy?
Asumiré que los siete días previos fueron intencionados.
LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) ) ;
LocalDate previousFriday = today.with( TemporalAdjusters.previous( DayOfWeek.FRIDAY ) ) ;
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 para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿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
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
- 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 .