Получение даты начала и окончания недели с помощью класса Java calendar

#java #android #date-range

#java #Календарь #день недели

Вопрос:

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

Комментарии:

1. У меня было что-то подобное, это делает его намного проще joda-time.sourceforge.net

Ответ №1:

Некоторый код, как это сделать с 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()));
}
  

Комментарии:

1. Я думаю, что в last.add(Calendar.DAY_OF_YEAR, 6);

2. ой, я виноват. Я думал, что это год 🙂 извините, ваш ответ правильный

3. В некоторых случаях это не удается, когда языковой стандарт устанавливает начало недели на что-то другое, кроме воскресенья. Например, здесь, в Италии, начало недели — понедельник, поэтому, когда cal оно приходится на воскресенье, у вас есть то first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK) MON - SUN , что есть 2 - 1 , поэтому вы добавляете дни вместо вычитания. Это приведет к тому, что ваши first и last даты будут ошибочно выпадать на следующей неделе. Решение состоит в том, чтобы убедиться, что смещение всегда равно нулю или отрицательно, т.е.: int weekDayOffset = first.getFirstDayOfWeek() - first.get(Calendar.DAY_OF_WEEK); if (weekDayOffset > 0) weekDayOffset -= 7;

Ответ №2:

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

 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
  

Ответ №3:

Если вам нужны все даты, то

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

Ответ №4:

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

 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
  

Ответ №5:

Я обнаружил, что формула, приведенная в принятом ответе, будет работать только в некоторых случаях. Например, ваша неделя начинается в субботу, а сегодня воскресенье. Чтобы прибыть в первый день недели, мы возвращаемся на 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);
  

Комментарии:

1. Можете ли вы предоставить объяснение кода в своем ответе?