алгоритм расчета недели # от даты с произвольным началом недели?(для iCal) - PullRequest
1 голос
/ 25 января 2012

Я могу найти только алгоритм для получения ISO 8601 недели (неделя начинается в понедельник).

Однако, спецификация iCal гласит:

Неделя определяется как семидневный период, начинающийся со дня неделя, определенная как начало недели (см. WKST). Неделя номер один из календарный год - первая неделя, содержащая не менее четырех (4) дней в этом календарном году.

Следовательно, он более сложный, чем ISO 8601, поскольку началом недели может быть любой день недели.

Существует ли алгоритм для определения того, какой номер недели у даты, с настраиваемым начальным днем ​​недели?

или ... есть ли в iCal4j функция, которая это делает? Определить неделю от даты?

Спасибо!

p.s. Ограничение: я использую язык JVM, который не может расширять класс Java, но я могу вызывать методы Java или создавать экземпляры классов Java.

Ответы [ 2 ]

4 голосов
/ 26 января 2012
if (input_date < firstDateOfTheYear(WKST, year))
{
    return ((isLeapYear(year-1))?53:52);
}
else
{
    return ((dayOfYear(input_date) - firstDateOfTheYear(WKST, year).day)/7 + 1);
}

firstDateOfTheYear возвращает первую календарную дату с указанием начала недели (WKST) и года, например, если WKST = четверг, год = 2012, то возвращается 5 января.

dayOfYear возвращает порядковый номердень года, например, 1 февраля = 32

Пример №1: 18 января 2012 г., начало недели - понедельник

  • dayOfYear (18 января,2012) = 18
  • firstDateOfTheYear (понедельник, 2012) = 2 января 2012

(18 - 2) / 7 + 1 = 3 Ответ Неделя №.3

Пример № 2: 18 января 2012 г., начало недели - четверг

  • dayOfYear (18 января 2012 г.) = 18
  • firstDateOfTheYear (четверг, 2012) = 5 января 2012 года

(18 - 5) / 7 + 1 = 2 Ответ Неделя №.2

Пример № 3: 1 января 2012 г., начало недели - понедельник

  • firstDateOfTheYear (понедельник, 2012) = 2 января 2012 г.
  • IsLeapYear (2012-1) = false

1 января 2012 г. <2 января 2012 г. Ответ Неделя №.52 </p>

2 голосов
/ 27 января 2012
  1. Пусть daysInFirstWeek будет числом дней в первой неделе года в январе. Неделя начинается в WKST день. (например, если 1 января - WKST день, верните 7)

  2. Установите dayOfYear в n-й день года введенной даты (например, 1 февраля = 32)

  3. Если dayOfYear меньше или равно daysInFirstWeek

    3,1. если daysInFirstWeek больше или равно 4, weekNo равно 1, перейдите к шагу 5.

    3,2. Пусть daysInFirstWeekOfLastYear будет числом дней в первой неделе предыдущего года в январе. Неделя начинается в WKST день.

    3,3. если daysInFirstWeekOfLastYear равно 4 или последний год является високосным, а daysInFirstWeekOfLastYear равно 5, weekNo равно 53, в противном случае weekNo равно 52, перейдите к шагу 5.

  4. Установите weekNo на ceiling((dayOfYear - daysInFirstWeek) / 7)

    4,1. если daysInFirstWeek больше или равно 4, увеличение weekNo на 1

    4,2. если daysInFirstWeek равно 53 и количество дней в первой неделе (начиная с WKST) января в году inputDate года + 1 больше или равно 4, установите weekNo в 1

  5. возврат weekNo

...