今が年の何週目か

ある日がその年の何週目かということについて。
というよりかは、年の1週目っていつよ?ってお話。


まずはISO8601の定義。

  • D は曜日を表し、月曜日が 1、日曜日は 7 である。

〜略〜

  • ある年における、「最初の木曜日を含む週が、その年の第1週である。」と規定されている。

これはJIS X 0301にも例示されている通り、

  • 「第1週は事実上、1月4日を含む週である。」という基準認識に等しい。
  • 年初において以下の曜日に該当する場合、その日は新年の曜日としては扱わず、あくまで旧年最終週の曜日として扱う、という事を意味する。
    • 1月1日金曜日・1月2日土曜日・1月3日日曜日

・・・
http://ja.wikipedia.org/wiki/ISO_8601

曜日は月曜日からで、1/4を含む週が1週目になるとのこと。
で、Javaのドキュメント。

WEEK_OF_YEAR フィールドに対して計算される値の範囲は、1 から 53 です。年の第 1 週は、その年から少なくとも getMinimalDaysInFirstWeek() 日を含む getFirstDayOfWeek() で始まるもっとも早い 7 日間です。このように第 1 週は getMinimalDaysInFirstWeek()、getFirstDayOfWeek() の値、および 1 月 1 日の曜日により変化します。ある年の第 1 週から翌年の第 1 週までの週は、必要に応じて 2 から 52 または 53 まで順に番号が付けられます。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/GregorianCalendar.html


とうわけで、このようにする必要がある?

Calendar calendar = new GregorianCalendar();
calendar.setMinimalDaysInFirstWeek(4);
calendar.setFirstDayOfWeek(Calendar.MONDAY);

calendar.set(2010, Calendar.JANUARY, 1);
System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));
→53


めんどくさい・・・