开发者

Java Calendar: calculate start date and end date of the previous week

开发者 https://www.devze.com 2023-04-12 07:40 出处:网络
What is most convenient and shortest way to get start and end dates of the previous week? E开发者_StackOverflow社区xample: today is 2011-10-12 (input data),but I want to get 2011-10-03 (Monday\'s dat

What is most convenient and shortest way to get start and end dates of the previous week? E开发者_StackOverflow社区xample: today is 2011-10-12 (input data),but I want to get 2011-10-03 (Monday's date of previous week) and 2011-10-09 (Sunday's date of previous week).


Here's another JodaTime solution. Since you seem to want Dates only (not timestamps), I'd use the DateMidnight class:

final DateTime input = new DateTime();
System.out.println(input);
final DateMidnight startOfLastWeek = 
    new DateMidnight(input.minusWeeks(1).withDayOfWeek(DateTimeConstants.MONDAY));
System.out.println(startOfLastWeek);
final DateMidnight endOfLastWeek = startOfLastWeek.plusDays(6);
System.out.println(endOfLastWeek);

Output:

2011-10-12T18:13:50.865+02:00
2011-10-03T00:00:00.000+02:00
2011-10-10T00:00:00.000+02:00


public static Calendar firstDayOfLastWeek(Calendar c) {
    c = (Calendar) c.clone();
    // last week
    c.add(Calendar.WEEK_OF_YEAR, -1);
    // first day
    c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
    return c;
}

public static Calendar lastDayOfLastWeek(Calendar c) {
    c = (Calendar) c.clone();
    // first day of this week
    c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
    // last day of previous week
    c.add(Calendar.DAY_OF_MONTH, -1);
    return c;
}


I would go for @maerics answer if third party library is not involved. I have to replace roll() method with add() method as roll will leave the higher field unchanged. e.g., 22nd August will be obtained from 1st August being rolled -7 days. Note the month remain unchanged. The source code goes as below.

public static Calendar[] getLastWeekBounds(Calendar c) {
  int cdow = c.get(Calendar.DAY_OF_WEEK);
  Calendar lastMon = (Calendar) c.clone();
  lastMon.add(Calendar.DATE, -7 - (cdow - Calendar.MONDAY));
  Calendar lastSun = (Calendar) lastMon.clone();
  lastSun.add(Calendar.DATE, 6);
  return new Calendar[] { lastMon, lastSun };
}


You can use the Calendar.roll(int,int) method with arguments Calendar.DATE and an offset for the current day of week:

public static Calendar[] getLastWeekBounds(Calendar c) {
  int cdow = c.get(Calendar.DAY_OF_WEEK);
  Calendar lastMon = (Calendar) c.clone();
  lastMon.roll(Calendar.DATE, -7 - (cdow - Calendar.MONDAY));
  Calendar lastSun = (Calendar) lastMon.clone();
  lastSun.roll(Calendar.DATE, 6);
  return new Calendar[] { lastMon, lastSun };
}

This function returns an array of two Calendars, the first being last week's Monday and last week's Sunday.

Wow, the Java date APIs are terrible.


Calendar today  = Calendar.getInstance();
Calendar lastWeekSunday =  (today.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) ? today.roll(-7): today.roll(Calendar.DAY_OF_YEAR, Calendar.SUNDAY - today.get(Calendar.DAY_OF_WEEK));
Calendar lastWeekMonday = lastWeekSunday.roll( Calendar.DAY_OF_YEAR, -6 );


Using Joda:

DateTime input;
DateTime startOfLastWeek = input.minusWeeks(1).minusDays(input.getDayOfWeek()-1);

DateTime endOfLastWeek = input.minusWeeks(1).plusDays(input.getDayOfWeek()+1);

DateTime endOfLastWeek = startOfLastWeek.plusDays(6);

EDIT:

Joda does not allow a different first day of the week, but strictly sticks to the ISO standard, which states that a week always starts on Monday. However, if you need to make that configurable, you could pass the desired first day of the week as a parameter. See the above link for some other ideas.

public DateTime getFirstDayOfPreviousWeek(DateTime input)
{
    return getFirstDayOfPreviousWeek(input, DateTimeConstants.MONDAY); 
}

public DateTime getFirstDayOfPreviousWeek(DateTime input, int firstDayOfWeek)
{
    return new DateTime(input.minusWeeks(1).withDayOfWeek(firstDayOfWeek));
}

public DateTime getLastDayOfPreviousWeek(DateTime input)
{
    return getLastDayOfPreviousWeek(input, DateTimeConstants.MONDAY); 
}

public DateTime getLastDayOfPreviousWeek(DateTime input, int firstDayOfWeek)
{
    return new DateTime(getFirstDayOfPreviousWeek(input, firstDayOfWeek).plusDays(6));
}
0

精彩评论

暂无评论...
验证码 换一张
取 消