俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

PHPでの日付計算はDateTimeで - 日報 #127

コーディングしている最中に、
どこでストレスを感じますか?
ストレスって言っても「こんな書き方しやがって!」的なものではなくて、
苦手意識というか、心理的ハードルが高くなる瞬間のことです。

例えば、僕は正規表現でのmatchパターンを書く時は結構ストレスを感じます。
「あぁ…だれか他に書いている人のをコピペしたい。。。」とすぐに思ってしまいます。
あと、沢山変数を使ったループ文を書くときも、変数の数の最適化ばかり気になって、
命名がぐちゃぐちゃになり、結局上手にかけないという苦手意識が働いちゃいます。

で、date周りの演算も結構苦手な領域の1つです。
2015-03-10の2日前はいつでしょう?って言われた時に、
時間ベースか日付ベース、どっちで引き算すればいいんだろう、、、
って本気で悩んでしまうタイプなのです。
しかもPHPの場合は特に警戒心が高まります。
というのもstrtotime関数が安心できぬ奴だからです。
https://www.google.co.jp/search?q=strtotime+%E3%83%90%E3%82%B0
日付周りの足し引き処理に苦手意識がある僕にとって、
表向き便利なのに、ちょいちょいバグがある関数ってのは本当に厄介です。
なので自分ではstrtotimeの使用を禁じています。
できるだけ安全にPHP上で日付計算をするためDateTimeクラスを使っています。
そしてどんな単純な日付オペレーションでも関数化しちゃいます。
怖くてしかたがないので、、、

例えば、2つの日付stringがあったとき、その差分を計算するときは、
こんな分かりづらいヘルパー関数とかも作って置いておいたりします。

/**
* recommended fromat : %a (day), %s (sec)
* @see http://php.net/manual/ja/dateinterval.format.php
* @param string $base
* @param string $opponent
* @param string $format
* @return number
*/
function date_dif($base,$opponent,$format='%a')
{
  $base_time=new DateTime($base);
  $opponent_time=new DateTime($opponent);
  $interval=$opponent_time->diff($base_time);
  return (int)$interval->format($format);
}

こんな周りくどいやりかたじゃなくて、秒数にして引いて、日付に戻せばいいじゃんとか思うと思いますが、
それでもこうやっちゃうくらいなんか苦手です。

皆さんもありませんかね、、、
ある特定の瞬間だけすごい「苦手だなぁ」という思いが強くなることって。。。
まぁ、、、雑談なんですけどね。