Posterior a observar en diferentes repositorios y páginas webs de internet al concluir nos encontramos con la resolución que te mostraremos más adelante.
Solución:
Respuesta actualizada usando Java 8
Utilizando Java 8 y manteniendo el mismo principio que antes (el primer día de la semana depende de su Locale
), debería considerar utilizar lo siguiente:
Obtén el primero y el último DayOfWeek
para un específico Locale
final DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
final DayOfWeek lastDayOfWeek = DayOfWeek.of(((firstDayOfWeek.getValue() + 5) % DayOfWeek.values().length) + 1);
Consulta para el primer y último día de esta semana
LocalDate.now(/* tz */).with(TemporalAdjusters.previousOrSame(firstDayOfWeek)); // first day
LocalDate.now(/* tz */).with(TemporalAdjusters.nextOrSame(lastDayOfWeek)); // last day
Demostración
Considera lo siguiente class
:
private static class ThisLocalizedWeek
// Try and always specify the time zone you're working with
private final static ZoneId TZ = ZoneId.of("Pacific/Auckland");
private final Locale locale;
private final DayOfWeek firstDayOfWeek;
private final DayOfWeek lastDayOfWeek;
public ThisLocalizedWeek(final Locale locale)
this.locale = locale;
this.firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
this.lastDayOfWeek = DayOfWeek.of(((this.firstDayOfWeek.getValue() + 5) % DayOfWeek.values().length) + 1);
public LocalDate getFirstDay()
return LocalDate.now(TZ).with(TemporalAdjusters.previousOrSame(this.firstDayOfWeek));
public LocalDate getLastDay()
return LocalDate.now(TZ).with(TemporalAdjusters.nextOrSame(this.lastDayOfWeek));
@Override
public String toString()
return String.format( "The %s week starts on %s and ends on %s",
this.locale.getDisplayName(),
this.firstDayOfWeek,
this.lastDayOfWeek);
Podemos demostrar su uso de la siguiente manera:
final ThisLocalizedWeek usWeek = new ThisLocalizedWeek(Locale.US);
System.out.println(usWeek);
// The English (United States) week starts on SUNDAY and ends on SATURDAY
System.out.println(usWeek.getFirstDay()); // 2018-01-14
System.out.println(usWeek.getLastDay()); // 2018-01-20
final ThisLocalizedWeek frenchWeek = new ThisLocalizedWeek(Locale.FRANCE);
System.out.println(frenchWeek);
// The French (France) week starts on MONDAY and ends on SUNDAY
System.out.println(frenchWeek.getFirstDay()); // 2018-01-15
System.out.println(frenchWeek.getLastDay()); // 2018-01-21
Respuesta original de Java 7 (desactualizado)
Simplemente use:
c.setFirstDayOfWeek(Calendar.MONDAY);
Explicación:
Ahora mismo, tu primer dia de la semana está configurado en Calendar.SUNDAY
. Esta es una configuración que depende de su Locale
.
Por lo tanto, un mejor alternativa sería inicializar su Calendar
especificando el Locale
te interesa.
Por ejemplo:
Calendar c = GregorianCalendar.getInstance(Locale.US);
… te daría tu Actual salida, mientras que:
Calendar c = GregorianCalendar.getInstance(Locale.FRANCE);
… te daría tu esperado producción.
Bueno, parece que obtuviste tu respuesta. Aquí hay un complemento que usa java.time en Java 8 y versiones posteriores. (Ver tutorial)
import java.time.DayOfWeek;
import java.time.LocalDate;
public class MondaySunday
public static void main(String[] args)
LocalDate today = LocalDate.now();
// Go backward to get Monday
LocalDate monday = today;
while (monday.getDayOfWeek() != DayOfWeek.MONDAY)
monday = monday.minusDays(1);
// Go forward to get Sunday
LocalDate sunday = today;
while (sunday.getDayOfWeek() != DayOfWeek.SUNDAY)
sunday = sunday.plusDays(1);
System.out.println("Today: " + today);
System.out.println("Monday of the Week: " + monday);
System.out.println("Sunday of the Week: " + sunday);
Otra forma de hacerlo, utilizando ajustadores temporales.
import java.time.LocalDate;
import static java.time.DayOfWeek.MONDAY;
import static java.time.DayOfWeek.SUNDAY;
import static java.time.temporal.TemporalAdjusters.nextOrSame;
import static java.time.temporal.TemporalAdjusters.previousOrSame;
public class MondaySunday
public static void main(String[] args)
LocalDate today = LocalDate.now();
LocalDate monday = today.with(previousOrSame(MONDAY));
LocalDate sunday = today.with(nextOrSame(SUNDAY));
System.out.println("Today: " + today);
System.out.println("Monday of the Week: " + monday);
System.out.println("Sunday of the Week: " + sunday);
Esto es lo que hice para obtener la fecha de inicio y finalización de la semana actual.
public static Date getWeekStartDate()
Calendar calendar = Calendar.getInstance();
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY)
calendar.add(Calendar.DATE, -1);
return calendar.getTime();
public static Date getWeekEndDate()
Calendar calendar = Calendar.getInstance();
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY)
calendar.add(Calendar.DATE, 1);
calendar.add(Calendar.DATE, -1);
return calendar.getTime();
Recuerda que tienes el privilegio agregar una reseña si te ayudó.