【CakePHP3】Cake\I18n\Timeクラスのmodify()の単位は、単数形複数形どちらでも良い

Bake-with-CakePHP Logo

CakePHP3のCake\I18n\Timeクラス。PHPのdate()やstrtotime()を組み合わせて書くよりも簡単に、現在日時からN時間前やN時間後などが計算できるので使っている方も多いはず。

僕もちょうど実装で使いたいと思った時にCakeの公式ドキュメントを眺めていたらmodify()の引数で渡す時間の単位がhourだったりhoursだったりで、”s”が付いても付かなくても良さそうな記述になっていて

「どっちが正なんだ!」

と思ったので、ちょっと調べてみた。検証したCakePHPのバージョンは3.6.13。

modify()の引数で渡す時間単位は単数/複数表記のどちらでも対応できるのが正

結論から先に言うと、どっちに統一するのが正という訳ではないようで、hour, hoursでもどちらでもOKというのが仕様のようだ。modify()関数は内部でpreg_match()関数を使用しており、hour, minute, secondというキーワードに反応するようになっている。

実際のコードは↑のようになっており、hoursやminutesのようにsが付いていてもpreg_match()で検出できるようになっているのだ。

 

その上で、

じゃあ単数形複数形をどう使い分けると良いのだろう?

と疑問が湧いたのだが、英語のお作法に習って考えると

  • 1の場合は1 hour, 1 minute, 1 secondで単数形
  • 2以上の場合は2 hours, 2 minutes, 2 secondsで複数形

にすれば良さそうだと思い至った。

実際Cakeの公式ドキュメントでも1の時は単数形で記載されており、2以上の時は複数形で記載されていたので、たぶんその解釈で合っていると思われる。メモ。