ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

年末の週番号は何番になるのが正しいの?

先日、以下のツイートをしました。


きっかけは、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」を指定しないと正しい値が取得できないことがわかりました。
覚えておきたいです。