11

I want to get the last and the first week of a week for a given date. e.g if the date is 12th October 2011 then I need the dates 10th October 2011 (as the starting date of the week) and 16th october 2011 (as the end date of the week) Does anyone know how to get these 2 dates using the calender class (java.util.Calendar) thanks a lot!

user421607
  • 175
  • 2
  • 4
  • 12

5 Answers5

35

Some code how to do it with the Calendar object. I should also mention joda time library as it can help you many of Date/Calendar problems.

Code

public static void main(String[] args) {

    // set the date
    Calendar cal = Calendar.getInstance();
    cal.set(2011, 10 - 1, 12);

    // "calculate" the start date of the week
    Calendar first = (Calendar) cal.clone();
    first.add(Calendar.DAY_OF_WEEK, 
              first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK));

    // and add six days to the end date
    Calendar last = (Calendar) first.clone();
    last.add(Calendar.DAY_OF_YEAR, 6);

    // print the result
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(df.format(first.getTime()) + " -> " + 
                       df.format(last.getTime()));
}
dacwe
  • 43,066
  • 12
  • 116
  • 140
  • I think there's a typo in `last.add(Calendar.DAY_OF_YEAR, 6);` – Rangi Lin Oct 04 '11 at 08:59
  • oops, my bad. I thought that was year :) sorry, your answer is correct – Rangi Lin Oct 04 '11 at 09:02
  • This fails in some cases when the locale sets the start of week to something else than Sunday. For example, here in Italy the start of week is Monday, so when `cal` is on Sunday, you have that `first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK)` is `MON - SUN` which is `2 - 1`, so you add days instead of subtracting. This cause your `first` and `last` dates to wrongly fall in the next week. A solution is to make sure that offset is always zero or negative, i.e: `int weekDayOffset = first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK); if (weekDayOffset > 0) weekDayOffset -= 7;` – lorenzo-s Jul 11 '18 at 07:05
2

This solution works for any locale (first day of week could be Sunday or Monday).

Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - c.getFirstDayOfWeek();
c.add(Calendar.DAY_OF_MONTH, -dayOfWeek);

Date weekStart = c.getTime();
// we do not need the same day a week after, that's why use 6, not 7
c.add(Calendar.DAY_OF_MONTH, 6); 
Date weekEnd = c.getTime();

For example, today is Jan, 29 2014. For the locale with Sunday as a first day of week you will get:

    start: 2014-01-26
    end: 2014-02-01

For the locale with Monday as a first day the dates will be:

    start: 2014-01-27
    end: 2014-02-02
Akima
  • 121
  • 8
1

If you want all dates then

first.add(Calendar.DAY_OF_WEEK,first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK)); 

for (int i = 1; i <= 7; i++) {
    System.out.println( i+" Day Of that Week is",""+first.getTime());
    first.add(Calendar.DAY_OF_WEEK,1);
}
Xavi López
  • 27,550
  • 11
  • 97
  • 161
LMK
  • 2,882
  • 5
  • 28
  • 52
1

Here is the sample code

public static void main(String[] args) {

    Calendar cal = Calendar.getInstance();
    cal.set(2016, 2, 15);

    {
        Calendar startCal = Calendar.getInstance();
        startCal.setTimeInMillis(cal.getTimeInMillis());

        int dayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);
        startCal.set(Calendar.DAY_OF_MONTH,
                (startCal.get(Calendar.DAY_OF_MONTH) - dayOfWeek) + 1);

        System.out.println("end date : " + startCal.getTime());
    }

    {
        Calendar endCal = Calendar.getInstance();
        endCal.setTimeInMillis(cal.getTimeInMillis());

        int dayOfWeek = endCal.get(Calendar.DAY_OF_WEEK);
        endCal.set(Calendar.DAY_OF_MONTH, endCal.get(Calendar.DAY_OF_MONTH)
                + (7 - dayOfWeek));

        System.out.println("start date : " + endCal.getTime());

    }
}

which will print

start date : Sun Mar 13 20:30:30 IST 2016
end date : Sat Mar 19 20:30:30 IST 2016
Visruth
  • 3,430
  • 35
  • 48
0

I have found the formula in the accepted answer will only work in some cases. For example your week starts on Saturday and today is Sunday. To arrive at the first day of the week we walk back 1 day, but the formula cal.get(Calendar.DAY_OF_WEEK) - cal.getFirstDayOfWeek() will give the answer -6. The solution is to use a modulus so the formula wraps around so to speak.

int daysToMoveToStartOfWeek =  (
  7 + 
  cal.get(Calendar.DAY_OF_WEEK) - 
  cal.getFirstDayOfWeek()
)%7;

cal.add(Calendar.DAY_OF_WEEK, -1 * daysToMoveToStartOfWeek);
34m0
  • 5,755
  • 1
  • 30
  • 22