2015-03-24 1 views
1

Я ищу, чтобы использовать GregorianCalendar, чтобы сделать некоторую логику на основе дней. Есть ли способ узнать, есть ли 2 даты на той же неделе? Я попытался с помощью get(Calendar.WEEK_OF_YEAR), и это имеет два минусов:.Использование GregorianCalendar для получения недель

1) Начиная с неправильного днем ​​недели (который, кажется, имеет потенциальное решение в setFirstDayOfWeek, однако предварительное тестирование не было успешным
2) Это решение не выдерживает много лет. Например, 30 декабря 2014 года и 1 января 2015 года должны быть на той же неделе.

Есть ли какое-либо решение для этого, которое не требует переключения библиотек?

+0

Необходимо ввести начальную и конечную дату недели. Затем вы можете использовать Date.before и Date.after. Вы можете использовать что-то вроде [this] (http://stackoverflow.com/questions/2937086/how-to-get-the-first-day-of-the-current-week-and-month), чтобы получить границы дат – MadProgrammer

+0

Быстрый вопрос - будет ли время для этих дат? Если нет, вы можете просто вычесть количество дней, заданных полем DAY_OF_WEEK, и сравнить их. –

+0

Рассматривали ли вы просмотр 'cal.get (Calendar.WEEK_OF_YEAR)'? – MadProgrammer

ответ

1

ОК, так как вы заявили, что будет компонент времени, я хотел бы использовать что-то похожее на @ MadProgrammer отвечают, но без сложности использования полный диапазон дат. У меня был бы статический метод что-то вроде этого.

public static Date firstOfWeek(Calendar cal) { 
    Calendar copy = new GregorianCalendar( 
     cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); 
    copy.set(Calendar.DAY_OF_WEEK, copy.getFirstDayOfWeek()); 
    return copy.getTime(); 
} 

Это возвращает Date в первый день недели, который включает в себя конкретный Calendar. Затем вы можете проверить, выпадают ли два календаря на той же неделе, как это.

if (firstOfWeek(cal1).equals(firstOfWeek(cal2))) { 
    ... 
} 
1

Вы задаете вопрос в основном, чтобы определить, попадает ли данная дата в данный диапазон дат (т.е. неделю).

Идея этого в основном является одним из двух действий даты в качестве якоря, из которого мы вычисляем диапазон дат (начало недели до конца недели), а затем определяем, попадает ли другая дата в этот диапазон.

Итак, во-первых, мы должны вычислить диапазон дат, что-то вроде ...

Calendar cal = Calendar.getInstance(); 
cal.setTime(date1); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.clear(Calendar.MINUTE); 
cal.clear(Calendar.SECOND); 
cal.clear(Calendar.MILLISECOND); 

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); 
Date startOfWeek = cal.getTime(); 

cal.add(Calendar.DATE, 6); 
cal.set(Calendar.HOUR_OF_DAY, 23); 
cal.set(Calendar.MINUTE, 59); 
cal.set(Calendar.SECOND, 59); 
cal.set(Calendar.MILLISECOND, 999); 
Date endOfWeek = cal.getTime(); 

Который даст нам две даты, первый, начиная с «начала недели» и один 6 дней позже («конец недели»). Мы вынуждаем значения времени до крайности дней, чтобы обеспечить захват диапазона падения.

Далее нам нужно определить, равна ли другая дата или после «начала недели» и равна или до «конец недели», что-то вроде ...

(date2.equals(startOfWeek) || date2.after(startOfWeek)) && (date2.equals(endOfWeek) || date2.before(endOfWeek)); 

Это тогда может быть завернута в миленькой метод, чтобы называть его проще ...

public static boolean isInSameWeek(Date date1, Date date2) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date1); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.clear(Calendar.MINUTE); 
    cal.clear(Calendar.SECOND); 
    cal.clear(Calendar.MILLISECOND); 

    cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); 
    Date startOfWeek = cal.getTime(); 

    cal.add(Calendar.DATE, 6); 
    cal.set(Calendar.HOUR_OF_DAY, 23); 
    cal.set(Calendar.MINUTE, 59); 
    cal.set(Calendar.SECOND, 59); 
    cal.set(Calendar.MILLISECOND, 999); 
    Date endOfWeek = cal.getTime(); 

    System.out.println("Week starts at : " + startOfWeek); 
    System.out.println(" Week ends at : " + endOfWeek); 

    return (date2.equals(startOfWeek) || date2.after(startOfWeek)) && (date2.equals(endOfWeek) || date2.before(endOfWeek)); 

} 

И тогда мы можем испытайте его ...

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
try { 
    Date date1 = sdf.parse("30/12/2014"); 
    Date date2 = sdf.parse("1/1/2015"); 

    System.out.println("Is in same week " + date1 + "/" + date2 + " = " + isInSameWeek(date1, date2)); 
    System.out.println(""); 

    date1 = sdf.parse("27/12/2014"); 
    System.out.println("Is in same week " + date1 + "/" + date2 + " = " + isInSameWeek(date1, date2)); 
} catch (ParseException exp) { 
    exp.printStackTrace(); 
} 

который выводит что-то вроде ...

Week starts at : Sun Dec 28 00:00:00 EST 2014 
    Week ends at : Sat Jan 03 23:59:59 EST 2015 
Is in same week Tue Dec 30 00:00:00 EST 2014/Thu Jan 01 00:00:00 EST 2015 = true 

Week starts at : Sun Dec 21 00:00:00 EST 2014 
    Week ends at : Sat Dec 27 23:59:59 EST 2014 
Is in same week Sat Dec 27 00:00:00 EST 2014/Thu Jan 01 00:00:00 EST 2015 = false 
+0

@DavidWallace Это, по сути, то, что он делает. Вместо того, чтобы проверять, попадает ли «дата» в тот же диапазон, вы проверяете, совпадает ли «начало недели» для обоих значений. В конце дня у вас по-прежнему почти одинаковое количество работы, это именно то, как я видел проблему. Он также (грубо) демонстрирует простой алгоритм проверки диапазона дат, который может быть дополнительно расширен и включен в этот код, чтобы уменьшить дублирование ... но это выходит за рамки ответа. Я лично, я бы смотрел на JodaTime или какой-то другой API времени, но это я – MadProgrammer

+0

@DavidWallace Помните, что я также сломал это в вопросе «диапазон дат», вот как я его увидел: P – MadProgrammer

+0

@DavidWallace I не скидка Есть лучшие способы сделать это, я просто видел это как «диапазон дат». Он «может» помочь ОП распознавать способы решения других проблем, это может быть не так: P – MadProgrammer

 Смежные вопросы

  • Нет связанных вопросов^_^