年末の週番号は何番になるのが正しいの?
先日、以下のツイートをしました。
今週は、2013年第53週と2014年第1週のどっちが正しい?プログラムの挙動を見ていると、2014年第1週みたい。根拠というかルールはどこかにあるのかな。
— AJYA (@ajyaa) 2013, 12月 31
きっかけは、PHPのdate関数でフォーマット文字列に「W」を指定して、2013年12月31日の週番号を取得したら、「01」だったことから気になりました。
週番号について検索
検索の結果、高精度計算サイトにISOで決まっていて、その年の第1週を最初の木曜日が含まれる週とする。
とありました。
年月日から週番号 - 高精度計算サイト
ISOを検索
週番号についてのISOを探した結果、8601で発行されていて、週の番号について読むと、年末において以下の曜日に該当する場合、その日は当年最終週の曜日としてでは無く、翌年第1週の曜日として扱うものとされている。
- 12月29日が月曜日の場合。
- 12月30日が月曜日または火曜日の場合。
- 12月31日が月曜日・火曜日・水曜日のいずれかの場合。
とありました。
2013年は「12月30日が月曜日」「12月31日が火曜日」なので、2013年12月31日の週番号を取得したら、「01」になるの根拠がわかりました。
ISO 8601 - Wikipedia
最後に、date関数の解説を改めて確認したら、「ISO-8601」と書かれているので、最初から確認しておけば、遠回りしなくて済みました。
PHP: date - Manual
週番号と年の取得テスト
date関数のフォーマットの説明を読んでいたら、「o」を指定するとISO-8601形式の年が取得できて、「Y」とは違う値が取得できるようなので、試してみました。2013年12月31日のUNIXタイムスタンプを取得して、週番号と年を2パターンで取得するコードです。
$work1 = mktime('10', '00', '00', '12', '31', '2013'); echo $work1 . '<br>'; $work2 = date('W', $work1); echo $work2 . '<br>'; $work3 = date('Y', $work1); echo $work3 . '<br>'; $work4 = date('o', $work1); echo $work4 . '<br>';
上記の結果は、
1388451600
01
2013
2014
となり、「o」は週番号を考慮した年が取得できました。
週番号と年を同時に取得する場合は、「o」を指定しないと正しい値が取得できないことがわかりました。
覚えておきたいです。