めんどくさいことをしている

日時の相対移動について

さらに 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"