从自定义周开始日期计算周#的算法? (对于iCal)

时间:2012-01-25 08:50:25

标签: algorithm calendar icalendar week-number ical4j

我只能找到获得ISO 8601周的算法(星期一开始一周)。

然而,iCal规范说

  

一周定义为七天,从当天开始   周定义为周开始(见WKST)。第一周的第一周   日历年是包含至少四(4)天的第一周   在那个日历年。

因此,它比ISO 8601更复杂,因为星期开始可以是一周中的任何一天。

是否有算法确定日期的周数,以及自定义的一周开始日期?

或...... iCal4j中是否有一个函数执行此操作?从日期确定一周?

谢谢!

P.S。限制:我使用的是无法扩展Java类的JVM语言,但我可以调用Java方法或实例化Java类。

2 个答案:

答案 0 :(得分:4)

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,则返回1月5日。

dayOfYear返回一年中的顺序数字日,例如2月1日= 32

示例#1: 2012年1月18日,周开始是星期一

  • dayOfYear(2012年1月18日)= 18
  • firstDateOfTheYear(2012年1月)= 2012年1月2日

(18 - 2)/ 7 + 1 = 3 回答周号。 3

示例#2: 2012年1月18日,周开始是星期四

  • dayOfYear(2012年1月18日)= 18
  • firstDateOfTheYear(2012年4月)= 2012年1月5日

(18 - 5)/ 7 + 1 = 2 回答周号。 2

示例#3: 2012年1月1日,星期一是星期一

  • firstDateOfTheYear(2012年1月)= 2012年1月2日
  • IsLeapYear(2012-1)= false

2012年1月1日&lt; 2012年1月2日 回答周号。 52

答案 1 :(得分:2)

  1. daysInFirstWeek为一年中第一周的天数。周从WKST天开始。 (例如,如果1月1日是WKST天,则返回7)

  2. dayOfYear设置为输入日期年份的第n天(例如2月1日= 32)

  3. 如果dayOfYear小于或等于daysInFirstWeek

    3.1。如果daysInFirstWeek大于或等于4,weekNo为1,请跳至步骤5.

    3.2。让daysInFirstWeekOfLastYear为1月份上一年第一周的天数。周从WKST天开始。

    3.3。如果daysInFirstWeekOfLastYear为4或去年为闰年而daysInFirstWeekOfLastYear为5,则weekNo为53,否则weekNo为52,请跳至步骤5.

    < / LI>
  4. weekNo设为ceiling((dayOfYear - daysInFirstWeek) / 7)

    4.1。如果daysInFirstWeek大于或等于4,则将weekNo增加1

    4.2。如果daysInFirstWeek等于53且WKST年的+ 1年1月的第一周(从inputDate开始)的天数大于或等于4,则设置weekNo到1

  5. 返回weekNo