2010-06-11 43 views
14

Estoy intentando crear un calendario semanal que tiene este aspecto: http://dhtmlx.com/docs/products/dhtmlxScheduler/sample_basic.htmlJava - Cómo calcular el primero y el último día de cada semana

¿Cómo puedo calcular cada fecha de la semana? Por ejemplo, esta semana es:

Lunes - Domingo
7 de junio de 8 de junio, 9 de junio de 10 de junio 11 de junio 12 de junio 13 de junio

+0

No entiendo dónde está el problema. Intenta volver a redactar la pregunta. – Xorty

Respuesta

40

supongo que esto hace lo que quiere:

// Get calendar set to current date and time 
Calendar c = Calendar.getInstance(); 

// Set the calendar to monday of the current week 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 

// Print dates of the current week starting on Monday 
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy"); 
for (int i = 0; i < 7; i++) { 
    System.out.println(df.format(c.getTime())); 
    c.add(Calendar.DATE, 1); 
} 
+0

Gracias esto es lo que quiero, si quiero el botón anterior puede obtener la fecha de la semana pasada alguna idea? – user236501

+0

Clase ' Calendar' contiene métodos para la aritmética de fechas. Para moverlo hacia atrás una semana (7 días), haga 'c.add (Calendar.DATE, -7);', por ejemplo. – Jesper

+0

Muchas gracias por su ayuda. – user236501

1

Si sabe qué día es hoy (viernes) y la fecha actual (11 de junio), se puede calcular el resto de los días de esta semana.

1

Yo recomiendo que use Joda Biblioteca de tiempo. La clase Calendario Gregoriano tiene los métodos weekOfWeekyear y dayOfWeek.

8

Primer día de esta semana.

Calendar c = Calendar.getInstance(); 
    while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) { 
     c.add(Calendar.DATE, -1); 
    } 
+0

No es necesario volver al día lunes por día, simplemente puede 'c.set (Calendar.DAY_OF_WEEK, Calendar.MONDAY);' configurar el calendario al lunes de la semana actual (ver mi respuesta). – Jesper

+4

Absolutamente no, @Jesper. Establecer el día de la semana no necesariamente retrocede. –

+0

¡Solución simple y elegante! – Exterminator13

0

El algoritmo que busca (calculando el día de la semana para cualquier fecha) es "La congruencia de Zeller". Aquí hay una aplicación Java:

http://technojeeves.com/joomla/index.php/free/57-zellers-congruence

+0

hay otra implementación @ http://helpdesk.objects.com.au/java/zellers-congruence-in-java ". Aunque como mencioné en esa publicación, es mejor que utilices la clase Calendar - http: //helpdesk.objects. com.au/java/use-calendar-class-to-get-localized-day-names, que también se puede usar para obtener el primer día de la semana - http://helpdesk.objects.com.au/java/ ¿cómo-hacer-obtener-la-fecha-del-primer-día-de-la-semana-actual – objects

2

Usted puede acumularse en esto: El siguiente código imprime la fecha inicial y final de cada semana durante 15 semanas a partir de ahora.

Calendar c = Calendar.getInstance(); 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
for(int i=0; i<15; i++) 
{ 
    System.out.print("Start Date : " + c.getTime() + ", "); 
    c.add(Calendar.DAY_OF_WEEK, 6); 
    System.out.println("End Date : " + c.getTime()); 
    c.add(Calendar.DAY_OF_WEEK, 1); 
} 
6

Simplemente ajustando el día de la semana no parece ser confiable. Considere el siguiente código simple:

Calendar calendar = Calendar.getInstance(Locale.GERMANY); 
calendar.set(2011, Calendar.SEPTEMBER, 18); 
System.out.printf("Starting day: %tF%n", calendar); 

calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.printf("Last monday: %tF%n", calendar); 
System.out.printf("First day of week: %d%n", calendar.getFirstDayOfWeek()); 

El resultado de ejecutar este programa es:

Starting day: 2011-09-18 
Last monday: 2011-09-19 
First day of week: 2 

En otras palabras, se dio un paso adelante en el tiempo. Para una configuración regional alemana, esta no es realmente la respuesta esperada. Tenga en cuenta que el calendario utiliza correctamente el lunes como primer día de la semana (solo para calcular la semana del año, tal vez).

5

Con la nueva fecha y hora de la API en Java 8 puede hacer:

LocalDate now = LocalDate.now(); 

// determine country (Locale) specific first day of current week 
DayOfWeek firstDayOfWeek = WeekFields.of(Locale.getDefault()).getFirstDayOfWeek(); 
LocalDate startOfCurrentWeek = now.with(TemporalAdjusters.previousOrSame(firstDayOfWeek)); 

// determine last day of current week 
DayOfWeek lastDayOfWeek = firstDayOfWeek.plus(6); // or minus(1) 
LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(lastDayOfWeek)); 

// Print the dates of the current week 
LocalDate printDate = startOfCurrentWeek; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE dd/MM/yyyy"); 
for (int i=0; i < 7; i++) { 
    System.out.println(printDate.format(formatter)); 
    printDate = printDate.plusDays(1); 
} 
2

Java.time

Usando java.time biblioteca construida en Java 8:

import java.time.DayOfWeek; 
import java.time.LocalDate; 
import static java.time.temporal.TemporalAdjusters.previousOrSame; 
import static java.time.temporal.TemporalAdjusters.nextOrSame; 

LocalDate now = LocalDate.now(); # 2015-11-23 
LocalDate first = now.with(previousOrSame(DayOfWeek.MONDAY)); # 2015-11-23 
LocalDate last = now.with(nextOrSame(DayOfWeek.SUNDAY)); # 2015-11-29 

Puede iterar sobre DayOfWeek.values() para obtener todos los días de la semana actual

DayOfWeek.values(); # Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) 
for (DayOfWeek day: DayOfWeek.values()) { 
    System.out.print(first.with(nextOrSame(day))); 
} # 2015-11-23, 2015-11-24, 2015-11-25, 2015-11-26, 2015-11-27, 2015-11-28, 2015-11-29 
1
Calendar startCal = Calendar.getInstance(); 
    startCal.setTimeInMillis(startDate); 
    Calendar endCal = Calendar.getInstance(); 
    endCal.setTimeInMillis(endDate); 
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MMMM-yyyy"); 
    while (startCal.before(endCal)) { 
     int weekNumber = startCal.get(Calendar.WEEK_OF_YEAR); 
     Calendar cal = Calendar.getInstance(); 
     cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
     cal.set(Calendar.WEEK_OF_YEAR, weekNumber); 
     Date sunday = cal.getTime(); 
     Log.d("sunday", "" + sdf.format(sunday)); 
     cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); 
     cal.set(Calendar.WEEK_OF_YEAR, weekNumber); 
     Date saturday = cal.getTime(); 
     Log.d("saturday", "" + sdf.format(saturday)); 
     weekNumber = weekNumber + 1; 
     startCal.set(Calendar.WEEK_OF_YEAR, weekNumber); 

    } 
Cuestiones relacionadas