Получение даты начала и конца недели с помощью класса календаря Java - PullRequest
11 голосов
/ 04 октября 2011

Я хочу получить последнюю и первую неделю недели для данной даты.например, если дата 12 октября 2011 г., тогда мне нужны даты 10 октября 2011 г. (в качестве даты начала недели) и 16 октября 2011 г. (в качестве даты окончания недели). Кто-нибудь знает, как получить эти 2 даты, используя календарькласс (java.util.Calendar) большое спасибо!

Ответы [ 5 ]

35 голосов
/ 04 октября 2011

Некоторый код, как это сделать с объектом Calendar.Я должен также упомянуть библиотека времени joda , поскольку она может помочь вам во многих проблемах Date/Calendar.

Код

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()));
}
2 голосов
/ 29 января 2014

Это решение работает для любой локали (первый день недели может быть воскресеньем или понедельником).

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();

Например, сегодня 29 января 2014 года. Для локали с воскресеньем в качестве первого дня недели вы получите:

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

Для локали с понедельником в качестве первого дня даты будут:

    start: 2014-01-27
    end: 2014-02-02
1 голос
/ 19 марта 2016

Вот пример кода

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());

    }
}

, который напечатает

start date : Sun Mar 13 20:30:30 IST 2016
end date : Sat Mar 19 20:30:30 IST 2016
1 голос
/ 21 марта 2013

Если вы хотите все даты, то

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);
}
0 голосов
/ 28 августа 2017

Я нашел формулу в принятом ответе будет работать только в некоторых случаях.Например, ваша неделя начинается в субботу, а сегодня воскресенье.Чтобы прийти в первый день недели, мы возвращаемся назад на 1 день, но формула cal.get(Calendar.DAY_OF_WEEK) - cal.getFirstDayOfWeek() даст ответ -6.Решение состоит в том, чтобы использовать модуль, чтобы формула, так сказать, оборачивалась.

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

cal.add(Calendar.DAY_OF_WEEK, -1 * daysToMoveToStartOfWeek);
...