1

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

但是,iCal规范说

一周被定义为一个 7 天的时间段,从定义为一周开始的一周中的某一天开始(请参阅 WKST)。日历年的第一周是该日历年中包含至少四 (4) 天的第一周。

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

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

或者... iCal4j中有这样的功能吗?从日期确定星期几?

谢谢!

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

4

2 回答 2

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 年星期一)= 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) = 假

2012 年 1 月 1 日 < 2012 年 1 月 2 日 回答周数 52

于 2012-01-26T01:29:22.883 回答
2
  1. daysInFirstWeek为 1 月一年中第一周的天数。一周从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。

  4. 设置weekNoceiling((dayOfYear - daysInFirstWeek) / 7)

    4.1。如果daysInFirstWeek大于或等于 4,则递增weekNo1

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

  5. 返回weekNo

于 2012-01-26T23:50:26.813 回答