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); }
こんな周りくどいやりかたじゃなくて、秒数にして引いて、日付に戻せばいいじゃんとか思うと思いますが、
それでもこうやっちゃうくらいなんか苦手です。
皆さんもありませんかね、、、
ある特定の瞬間だけすごい「苦手だなぁ」という思いが強くなることって。。。
まぁ、、、雑談なんですけどね。