PHP:週数の数え方をよくよく知らなくて、予想外の動作が発生した
週送りの機能が正常に動作していませんでした。
photo credit: *Kicki* via photopin cc
予想外の動作の状況
前週/次週というボタンがあって、1週間毎に遷移する機能(=週送り機能)を作りましたが、年をまたぐと正常に動作しませんでした。
2013年1月7日(月)の週を表示していて、前週ボタンをクリックすると、2012年1月2日(月)の週になってしまいます。
2012年12月24日(月)の週を表示していて、次週ボタンをクリックすると、2012年1月2日(月)の週になってしまいます。
原因の調査
動作を確認していると、前週/次週ボタンに設定しているパラメータがおかしいことに気がつきました。
プログラムは、年と週番号をGETパラメータで受け取るようになっています。
2013年1月7日(月)の週を表示しているとき、前週ボタンには、年:2013、週番号:01が設定されていて、ボタンを押したときにGETパラメータとして利用することを期待していましたが、実際には、年:2012、週番号:01が設定されています。
2012年12月24日(月)の週を表示しているとき、次週ボタンには、年:2013、週番号:01が設定されていて、ボタンを押したときにGETパラメータとして利用することを期待していましたが、実際には、年:2012、週番号:01が設定されています。
なぜそうなるかと調べると、2013年1月7日(月)の週を表示しているとき、1週間前は2012年12月31日(月)になるため、週番号をPHPのdate()で取得すると01を返しますが、年を取得すると2012を返します。そのため、設定されるパラメータが期待した値ではなかったことがわかりました。
2012年12月24日(月)の週のときも同じ原因です。
対策方法
GETパラメータを変更するのが一番の解決策だとは思いましたが、変更の規模が大きくなりそうだったので、条件付けして値を補正することにしました。
補正の方法は、
- 前週ボタンに設定する週番号が01で、前週ボタンと次週ボタンの年が異なる場合は、前週ボタンの年に1を足す。
- 次週ボタンに設定する週番号が01で、前週ボタンと次週ボタンの年が同一の場合は、次週ボタンの年に1を足す。
となりました。
年が替わるあたりのときは、注意深く動作の確認が必要になってきます。