2010-12-27 10 views
9

Pedí How to detect if a date is within this or next week in Java? pero las respuestas fueron confusas, así que ahora creo que si puedo encontrar el domingo pasado y el próximo domingo, cualquier día en el medio es esta semana, y cualquier día entre el próximo domingo y el domingo después de eso es la próxima semana , Estoy en lo correcto ?¿Cómo llegar el domingo pasado y el próximo domingo en Java?

Así que mi nueva pregunta es: ¿Cómo llegar el domingo pasado y el próximo domingo en Java?

+0

¿Qué pasaría si el día actual es domingo? –

+0

Si hoy es domingo, es el primer día de la semana de 7 días, comenzando esta mañana a las 00:00 hasta el próximo domingo a las 00:00 esta semana. – Frank

Respuesta

12

¿Qué tal esto:

Calendar c=Calendar.getInstance(); 
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); 
c.set(Calendar.HOUR_OF_DAY,0); 
c.set(Calendar.MINUTE,0); 
c.set(Calendar.SECOND,0); 
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss"); 
System.out.println(df.format(c.getTime()));  // This past Sunday [ May include today ] 
c.add(Calendar.DATE,7); 
System.out.println(df.format(c.getTime()));  // Next Sunday 
c.add(Calendar.DATE,7); 
System.out.println(df.format(c.getTime()));  // Sunday after next 

El resultado:

Sun 2010/12/26 00:00:00 
Sun 2011/01/02 00:00:00 
Sun 2011/01/09 00:00:00 

Cualquier día entre los dos primeros es esta semana, cualquier cosa entre los dos últimos es la próxima semana.

+1

No es la mejor respuesta. Las clases java.util.Date y .Calendar son tan malas que incluso Sun/Oracle las abandonó. El nuevo [paquete java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) se incluye ahora en Java 8 para suplantar las clases antiguas. [Joda-Time] (http://www.joda.org/joda-time/) inspiró java.time y tiene algunas características superiores. –

+3

¡Si no puede usar Java 8, esta solución es hermosa! En Android, estamos limitados a Java 6 API. – nat101

+0

Para aquellos que buscan una solución Java 8, publiqué una respuesta a continuación. –

0

Se podría tratar de trabajar con el campo Calendar.WEEK_OF_YEAR, que le da la representación numérica de la semana dentro del año en curso.

@Test 
public void testThisAndNextWeek() throws Exception { 
    GregorianCalendar lastWeekCal = new GregorianCalendar(2010, 
      Calendar.DECEMBER, 26); 
    int lastWeek = lastWeekCal.get(Calendar.WEEK_OF_YEAR); 

    GregorianCalendar nextWeekCal = new GregorianCalendar(2011, 
      Calendar.JANUARY, 4); 
    int nextWeek = nextWeekCal.get(Calendar.WEEK_OF_YEAR); 

    GregorianCalendar todayCal = new GregorianCalendar(2010, 
      Calendar.DECEMBER, 27); 
    int currentWeek = todayCal.get(Calendar.WEEK_OF_YEAR); 

    assertTrue(lastWeekCal.before(todayCal)); 
    assertTrue(nextWeekCal.after(todayCal)); 
    assertEquals(51, lastWeek); 
    assertEquals(52, currentWeek); 
    // New Year.. so it's 1 
    assertEquals(1, nextWeek); 
} 
4

Sin utilizar un mejor paquete de hora/fecha ...

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 
Calendar now = new GregorianCalendar(); 
Calendar start = new GregorianCalendar(now.get(Calendar.YEAR), 
     now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH)); 

while (start.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { 
    start.add(Calendar.DAY_OF_WEEK, -1); 
} 

Calendar end = (Calendar) start.clone(); 
end.add(Calendar.DAY_OF_MONTH, 7); 

System.out.println(df.format(now.getTime())); 
System.out.println(df.format(start.getTime())); 
System.out.println(df.format(end.getTime())); 

Si hoy es domingo, se considera el inicio del periodo de tiempo. Si quiere un período de esta semana y la semana próxima (como suena en su pregunta), puede sustituir 14 en lugar de 7 en la línea end.add (...). Los tiempos se establecen a la medianoche para la comparación de otro objeto que se encuentra entre el inicio y el final.

4

Primero, no use el paquete Fecha/Hora de Java. Hay un paquete de utilidades mucho mejor llamado Joda-Time - descárguelo y úselo.

Para determinar si su tiempo es en esta semana, la semana pasada, o cualquier semana en todo, hacer esto:

  1. Cree dos objetos Intervalo - uno para la semana pasada y uno para esta semana
  2. Uso el método contiene (largo) para determinar qué intervalo contiene la fecha que está buscando.

Existen varias maneras geniales de crear dos semanas consecutivas. Puede configurar una Duración de una semana, encontrar la hora de inicio para la primera semana y simplemente crear dos Intervalos basados ​​en esa hora de inicio. Siéntase libre de encontrar cualquier otra forma que funcione para usted: el paquete tiene numerosas formas de llegar a lo que desea.


EDIT:

Joda-Time puede ser downloaded here, y aquí es un ejemplo de cómo Joda haría esto:

// Get the date today, and then select midnight of the first day of the week 
// Joda uses ISO weeks, so all weeks start on Monday. 
// If you want to change the time zone, pass a DateTimeZone to the method toDateTimeAtStartOfDay() 
DateTime midnightToday = new LocalDate().toDateTimeAtStartOfDay(); 
DateTime midnightMonday = midnightToday.withDayOfWeek(DateTimeConstants.MONDAY); 

// If your week starts on Sunday, you need to subtract one. Adjust accordingly. 
DateTime midnightSunday = midnightMonday.plusDays(-1); 

DateTime midnightNextSunday = midnightSunday.plusDays(7); 
DateTime midnightSundayAfter = midnightNextSunday.plusDays(7); 

Interval thisWeek = new Interval(midnightSunday, midnightNextSunday); 
Interval nextWeek = new Interval(midnightNextSunday, midnightSundayAfter); 

if (thisWeek.contains(someDate.getTime())) System.out.println("This week"); 
if (nextWeek.contains(someDate.getTime())) System.out.println("Next week"); 
+1

Me encanta el tiempo joda, pero quizás esto sería mejor con un ejemplo de código? ;) – crockpotveggies

+0

Tienes razón, debería haber hecho exactamente eso. Editado –

1

recientemente he desarrollado Lamma Date que está diseñado para resolver este uso caso:

Date today = new Date(2014, 7, 1);  // assume today is 2014-07-01 
Date previousSunday = today.previousOrSame(DayOfWeek.SUNDAY); // 2014-06-29 
Date nextSunday = today.next(DayOfWeek.SUNDAY);     // 2014-07-06 
12

Pensé en agregar una solución de Java 8 para p osteridad.

final LocalDate today = LocalDate.of(2015, 11, 20); 
final LocalDate nextSunday = today.with(next(SUNDAY)); 
final LocalDate thisPastSunday = today.with(previous(SUNDAY)); 

Este enfoque también funciona para otras clases temporales como ZonedDateTime. Tal como está escrito, asume las siguientes importaciones estáticas:

import static java.time.DayOfWeek.SUNDAY; 
import static java.time.temporal.TemporalAdjusters.next; 
import static java.time.temporal.TemporalAdjusters.previous; 
+0

Gran solución, gracias – KZoNE

Cuestiones relacionadas