めんどくさいことをしている
日時の相対移動について
さらに DATETIME から 30 秒先のDATETIMEを取得する方法。
一度、DATETIEMをunix timestampに変換して、30秒を足して、DATETIEMに戻すだけ。<?php $d1 = date("Y-m-d H:i:s", time()); $d2 = date("Y-m-d H:i:s", strtotime($d1) + 30); ?>
<?php $d2 = date("Y-m-d H:i:s", strtotime('+30 seconds', time()); ?>
上記例だとstrtotime()の第2引数もなくてもいいですね.
<?php $d2 = date("Y-m-d H:i:s", strtotime('+30 seconds'); ?>
ちなみに「+1 minite」「+5 day」「+2 month」「yesterday」などもできます.ただし特に月単位の移動は気をつけましょう.
$ php -r 'var_dump(date("Y-m-d H:i:s", strtotime("2007-01-31 +1 month")));' string(19) "2007-03-03 00:00:00"
「1ヶ月移動して端数分日数を移動した」と思えばこの結果もわからなくはないですが,おそらく多くの人が期待しない挙動になると思います.
#思考的に言うと,「1月31日から1ヶ月の移動」なのか「1月末から1ヶ月の移動」なのかとか隠れた意図がありますよね
date()が嫌い
ちなみに個人的にはdate()は整形文字列の作成関数としては汎用性が低くてとても嫌いで,基本的にstrftime()を利用しています.
$ php -r 'var_dump(date("Last login: Y-m-d H:i:s", strtotime("+30 seconds")));' string(48) "0am5031 Wednesday2007105712: 2007-12-26 10:57:50" $ php -r 'var_dump(strftime("Last login: %Y-%m-%d %H:%M:%S", strtotime("+30 seconds")));' string(31) "Last login: 2007-12-26 10:59:48"
とか.まぁそうはいっても私はこんなコードは別の理由で基本的に書かないですけど,どうしてもi18nなメッセージ中に日時を入れたいときは使いたくなるかもしれません.
#「i」とかどうしても覚えられない
でもdate()を使うほうがとても処理が楽になる場合
ただこの時ばかりはdate()を使うことがあります.それは「指定月が何日で構成されているか」を調べるときです.
$ php -r 'for ($i = 1; $i <= 12; $i++) { var_dump(date("t", strtotime(sprintf("2007-%02d-01", $i))));}' string(2) "31" string(2) "28" string(2) "31" string(2) "30" string(2) "31" string(2) "30" string(2) "31" string(2) "31" string(2) "30" string(2) "31" string(2) "30" string(2) "31" $ php -r 'for ($i = 1; $i <= 12; $i++) { var_dump(date("t", strtotime(sprintf("2008-%02d-01", $i))));}' string(2) "31" string(2) "29" <= うるう年をそれっぽく処理してくれていることに注目 string(2) "31" string(2) "30" string(2) "31" string(2) "30" string(2) "31" string(2) "31" string(2) "30" string(2) "31" string(2) "30" string(2) "31"