Номера недель от даты начала до даты окончания Java - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь получить номера недель, которые попадают между заданной датой начала и датой окончания в Java. Это ISO8601 дата.

Example 
startDate - "2018-08-24T12:18:06,166"
endDate -  "2019-08-24T11:18:06,166"

Номер текущей недели - 34.

В этом примере я получу 34,35,36 ... номер прошлой недели 2018..1,2 ... номер последней недели 2019 и т. Д.

Есть ли хорошее решение для этого?

В настоящее время у меня получилось, что он работал с диапазоном дат того же года, что я пытался, я получаю номер начальной и конечной недели из начальной и конечной даты, а затем зацикливаю его, давая начальное и конечное значения. Но если диапазон дат падает на несколько лет, как бы это было? Может ли кто-нибудь помочь мне

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Ответ YCF_L правильный.

YearWeek

Вы можете добавить библиотеку ThreeTen-Extra в ваш проект, чтобы использовать ее класс YearWeek.Этот класс представляет конкретную неделю с использованием стандартного определения недели в соответствии с ISO 8601: начинается в понедельник, неделя № 1 содержит первый четверг календарного года, последние несколько дней окончания / начала календарного года могут попасть вследующий / предыдущий недельный год

YearWeek ywStart = YearWeek.from( startDate ) ;

Увеличивайте, как показано в другом ответе, но собирайте YearWeek объекты, а не целые числа.

ArrayList< YearWeek > yearWeeks = new ArrayList<>( countOfWeeks + 2 ) ;  // Add one or two for good measure. 
…
YearWeek yw = yw.plusWeeks( 1 ) ;
yearWeeks.add( yw ) ;

Чтобы создать отчет, вызовите метод YearWeek::toString для генерации текста в стандартном формате ISO 8601: гггг-Www, например 2018-W43.

0 голосов
/ 24 августа 2018

Если вы используете Java 8, вы можете использовать java.time API. Вот так:

int addWeek = 0;
if(startDate.get(WeekFields.ISO.weekOfYear()) < endDate.get(WeekFields.ISO.weekOfYear())){
    addWeek = 1;
}
long weeks = WEEKS.between(startDate, endDate) + addWeek;//Get the number of weeks in your case (52)
List<Integer> numberWeeks = new ArrayList<>();
if (weeks >= 0) {
    int week = 0;
    do {
        //Get the number of week
        int weekNumber = startDate.plusWeeks(week).get(WeekFields.ISO.weekOfYear());
        numberWeeks.add(weekNumber);
        week++;
    } while (week <= weeks);
}

Ideone demo

[34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 
 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]

Обратите внимание, что вы получаете номера обеих недель за оба года, недели 2018 [34-52], а затем недели 2019 [1-33]

...