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

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

PHP:週数の数え方をよくよく知らなくて、予想外の動作が発生した

週送りの機能が正常に動作していませんでした。

f:id:AJYA:20130108215342j:plain

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を足す。

となりました。

 

年が替わるあたりのときは、注意深く動作の確認が必要になってきます。