我只能找到获得ISO 8601周的算法(周从周一开始)。
然而,iCal规范中说
一周被定义为七天,从周定义为周开始(参见WKST)。第1周日历年是指至少包含四(4)天的第一周在那个日历年。
因此,它比ISO 8601更复杂,因为一周的开始可以是一周中的任何一天。
有没有一种算法可以通过自定义的一周的开始日来确定日期的周数?
或者。。。iCal4j中有这样的函数吗?从约会中确定周号?
谢谢!
p.s.限制:我使用的JVM语言不能扩展Java类,但我可以调用Java方法或实例化Java类。
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年,星期一)=2012年1月2日
(18-2)/7+1=3回答第3周
示例#2:2012年1月18日,本周开始时间为周四
- dayOfYear(2012年1月18日)=18
- firstDateOfTheYear(2012年,星期四)=2012年1月5日
(18-5)/7+1=2回答第2周
示例#3:2012年1月1日,本周开始时间为星期一
- firstDateOfTheYear(2012年,星期一)=2012年1月2日
- IsLeapYear(2012-1)=false
2012年1月1日<2012年1月2日回答第52周
设
daysInFirstWeek
为一年中第一周的1月天数。本周从WKST
开始。(例如,如果1月1日是WKST
日,则返回7)将
dayOfYear
设置为输入日期年份的第n天(例如2月1日=32日)如果
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。将
weekNo
设置为ceiling((dayOfYear - daysInFirstWeek) / 7)
4.1.如果
daysInFirstWeek
大于或等于4,则将weekNo
增加14.2.如果
daysInFirstWeek
等于53,并且inputDate
的年份+1的第一周(从WKST
开始)的天数大于或等于4,则将weekNo
设置为1返回
weekNo