1

ISO 8601週を取得するためのアルゴリズムしか見つかりません(週は月曜日から始まります)。

ただし、iCalの仕様によると

1 週間は、週の開始日として定義された曜日から始まる 7 日間として定義されます (WKST を参照)。暦年の第 1 週は、その暦年に少なくとも 4 日を含む最初の週です。

したがって、週の開始日を任意の曜日にすることができるため、ISO 8601 よりも複雑です。

カスタムの開始曜日を指定して、日付の週番号を特定するアルゴリズムはありますか?

または...これを行うiCal4jの機能はありますか?日付から週番号を決定しますか?

ありがとう!

ps 制限: Java クラスを拡張できない JVM 言語を使用していますが、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) = false

2012 年 1 月 1 日 < 2012 年 1 月 2 日 Answer Week no. 52

于 2012-01-26T01:29:22.883 に答える
2
  1. daysInFirstWeek1 月にある年の最初の週の日数を とします。週はあるWKST日から始まります。(例: 1 月 1 日がWKST日の場合、7 を返します)

  2. dayOfYear入力日付の年の n 日目に設定(例: 2 月 1 日 = 32)

  3. dayOfYearが以下の場合daysInFirstWeek

    3.1. daysInFirstWeek4 以上で1 の場合weekNoは、手順 5 に進みます。

    3.2. daysInFirstWeekOfLastYearを、前年の第 1 週の 1 月の日数とします。週はあるWKST日から始まります。

    3.3. daysInFirstWeekOfLastYear4 または昨年が閏年daysInFirstWeekOfLastYearで 5 の場合はweekNo53、それ以外の場合weekNoは 52 の場合は、手順 5 に進みます。

  4. weekNoに設定ceiling((dayOfYear - daysInFirstWeek) / 7)

    4.1. daysInFirstWeek4 以上の場合、weekNo1ずつ増加

    4.2. daysInFirstWeek53 に等しく、 の年の 1 月の最初の週 ( から始まる) の日数+ WKST1inputDateが 4 以上の場合、weekNo1に設定されます。

  5. 戻るweekNo

于 2012-01-26T23:50:26.813 に答える