#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. Можете ли вы предоставить объяснение кода в своем ответе?