[PHP]第53週の週番号が「01」になる件に対応する関数を書いた

※下書き段階で投稿してしまったので、再投稿

PHPのdate(‘W’)が返す週番号は、第53週では’01’を返します。strftime(‘%W’)も同様です。

この仕様は、ISO規格に基づいています。

http://ja.wikipedia.org/wiki/ISO_8601#.E5.B9.B4.E3.81.A8.E9.80.B1.E3.81.A8.E6.9B.9C.E6.97.A5

以下、上記Wikipedia記事より引用

この挙動は、PHPのバグではありません。しかし、PHPアプリケーションにおいてバグを作りこみがちな挙動の1つだと思います(実際、私も2014年最初に修正したバグは、この挙動に起因するバグでした)。

以下は、上記条件の場合には、’01’ではなく’53’を返す関数です。

「53」を返す処理については、仕様通りに「月日」+「曜日」で判定を行っています。ただ、この関数が必要な場合というのは、「01」が返されて困る場合に「53」を返すことだと思います。したがって、処理方法(2)でも、実用上は問題無いでしょう。

以下は、テスト付きのバージョンです。phpコマンドで実行して、結果が「ok」ならテストに合格したことになります。また、TAPに基づいたテストなので、proveコマンドでもテストできます(proveで実行するため、1行目にシバンを付けています)。

コメントを残す