2009年9月25日金曜日

Gcal2PDF 週番号について

「超」整理手帳フォーラムで興味深いエントリを読みました。

2010年は週番号がずれる??

元旦の曜日は日曜日や月曜日とは限らないので、新年第1週に旧年の端数を含めるか、それとも旧年最終週に新年の端数を含めるか、が問題になります。
この件について、ISOでは「4日以上あれば第1週」と定めているとか。こんなことも標準化されていたとは。
2009/10/25追記:
ISO8601では、上記の規定に加え、月曜日を週の開始曜日にする、とも規定されているようです。

ところでGcal2PDFにも週番号をつけています。
これについては、週初日の日付が年内何週目に含まれるか、という情報をCalendarオブジェクトから取得してそのまま使っています。
つまり上に書いた問題について、どうなるかはJavaの実装次第。
ためしに2010年1月1日は第何週と判定されるか調べてみました。

Calendar cal = Calendar.getInstance();
cal.set(2010,0,1);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR));

上記コードの出力結果は「1」となりました。2010年1月1日は第1週と判定されています。Calendarクラスについてもう少し調べてみたところ、setMinimalDaysInFirstWeek()というメソッドが用意されており、年の第1週に新年の日付を何日含めるようにするかを自由に設定できるようです。

Calendar cal = Calendar.getInstance();
System.out.println(cal.getMinimalDaysInFirstWeek());

上記のコードで、デフォルトでMinimalDaysInFirstWeekにどのような数値が入っているかを確かめたところ、「1」でした。
つまりデフォルトでは1月1日が含まれる週は必ず第1週ということになります。ISOに準拠したければ「4」を、旧年の端数を一切含めないようにするには「7」をセットすればいいということになります。
ためしに、ISOに準拠するようにMinimalDaysInFirstWeekに「4」をセットして、2010年1月1日が第何週と判定されるかを調べてみました。

Calendar cal = Calendar.getInstance();
cal.setMinimalDaysInFirstWeek(4);
cal.set(2010,0,1);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR));

上記コードの出力結果は「52」となります。つまり2010年1月1日は2009年第52週に含まれるようになりました。
2010年1月1日は金曜日なので、週が日曜日から始まっていると仮定すると、1月1日が含まれる週は、新年の日付が2日(金曜日と土曜日)しか含まれないことになり、年の第1週たる条件を満たさなくなるわけです。

2009/10/25追記:
ISO8601では、上記の規定に加え、「月曜日を週の開始曜日にする」、とも規定されているようです。上記の例では「週が日曜日から始まっていると仮定」としていますがこれはISOに準拠しようとする上では間違いです。次に挙げるコードでは、上記のコードに1行足して週の開始曜日を月曜日にしています。この結果、2010年1月1日は53週と判定されることになります。

Calendar cal = Calendar.getInstance();
cal.setMinimalDaysInFirstWeek(4);
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.set(2010,0,1);
System.out.println(cal.get(Calendar.WEEK_OF_YEAR));

4 コメント:

matsukei さんのコメント...

突然のコメントで、失礼します。
いつもGcal2PDFを利用させていただいております。
特に最近のバージョンアップで、カレンダー名毎に印刷するしないを設定できる機能は、待ち焦がれていた機能でした。

実は、今回のバージョンアップに当たり、動作に不具合が生じたので、操作方法にミスがあるのか、当方のPCの問題なのか解決できなかったため、ご教示願います。

20090924バージョンが起動しません。
20090828バージョンは、起動するのですが、不規則にGoogleカレンダーのデータを取得できません。(定期的な設定をしているスケジュールが取得できないことが多いのですが、すべてではありません。)

以上、当方のPCに問題があるかもしれませんが、ご連絡させていただきました。よろしくお願いいたします。

shido さんのコメント...

matsukeiさん、コメントありがとうございます。

ご指摘の件について、調べたところ24日分のファイルのうち、Windows用に不備があり起動しない状態でした。急ぎ修正したものに差し替えました。Windows上でのテストを怠ったためであり、お恥ずかしい限りです。

次に、繰り返し予定の印字に脱漏があるとの件ですが、私自身がGoogleカレンダーの繰り返し予定機能をふだん使っていないため、バグの発見・修正があまり進んでいないのが現状です。お申し越しを受けて、思いつくところを直してみました。下記のリンクのファイルではいかがでしょうか。

http://www.box.net/shared/13zxeyzc2y

matsukei さんのコメント...

shidoさま

早速の対応ありがとうございました。
試してみたところ、すべての繰り返し予定データが印刷されるようになりました。
これからも、ますます使いやすく改良されることを期待しております。(といっても、今のところ、これ以上の要望は思いつかないくらい、完璧です。)

これからも愛用させていただきます。
ありがとうございました。

shido さんのコメント...

matsukeiさん、コメントありがとうございます。

いろいろ改良したいアイディアはあるんですが、実現する技術と時間のほうがどうも・・・。

ライフワークとして地道にがんばります!