phpで日付を操作するDateTime関数
date関数の方が感覚的に書きやすい気がしますが、2038年問題にも対応しているという事で、こっちでコードを書いてみました。
コードの目標
wordpressで作りたい機能があったので、その機能に必要だったので勉強しました。
DateTimeで作りたかった機能の一部としては
・現在日時と来月1日までの正確な時間差の取得
現在の日時を取得
来月の日付が切り替わる時間を取得
・取得した時間差を秒に変換
現在と来月1日0時0分0秒までの時間を取得
その時間を秒に変換する。
たったこれだけですが、結構つまづいたので記録しておきます。
現在日時と来月1日までの時間差の取得
こっちの方はそれほど困らずに書けました。
下記コードは説明も兼ねているので実際に使用する部分は非常に短いです。
date_default_timezone_set( 'Asia/Tokyo' );
$dt = new DateTime('now');
$dtdt = $dt->format('Y-m-d-H-i-s');
echo "現在" . $dt->format('Y-m-d-H-i-s') . "<br>";
// 実行結果:2014-05-27-09-40-38
$dt_2 = new DateTime('midnight first day of next month');
echo "来月" . $dt_2->format('Y-m-d-H-i-s') . "<br>";
// 実行結果:2014-06-01-00-00-00
// 来月と現在の日時の差分を計算
$d = $dt_2->diff($dt, true);
一行目のdate_default_timezone_set( ‘Asia/Tokyo’ );でタイムゾーンの設定
$dt = new DateTime(‘now’);で現在日時を取得
$dt_2 = new DateTime(‘midnight first day of next month’);で来月1日の日付が切り替わる時間を取得しています。
ここでちょっと躓いたのですが【first day of next month】で”来月の初日時を取得”との記事を多く見ましたが、正確には”来月の初日”の取得であって、時間と分、秒は実行時のものになります。
【midnight first day of next month】とする事で日付が変わる瞬間に出来ました。
最後の行、$d = $dt_2->diff($dt, true);で現在の時間と来月の差を取得しています。
秒に変える
取得した差分の時間を秒に変えていきます。
ここで結構はまりました。
// オブジェクトの値を取り出す準備
$test = get_object_vars($d);
// 値を取り出し秒に変える
$day = $test["d"] * 24 * 60 * 60;
$hour = $test["h"] * 60 * 60;
$minutes = $test["i"] * 60;
$second = $test["s"];
// 合計を算出する
$difftime= $day + $hour + $minutes + $second;
echo $difftime . "<br>";
// 実行結果:396026
値の取り出しではまったのですが、、、
datetime関数で得られるのはオブジェクトらしく、オブジェクトの値をそのまま取り出そうとすると【Cannot use object of type DateInterval as array】といったエラーが出ます。
これを解決する為に一度get_object_varsでオブジェクトプロパティを配列にしています。
$day = $test[“d”] * 24 * 60 * 60;から下は、取得した日時分を秒に変えて変数に格納しています。
最後に$difftime= $day + $hour + $miutes + $second;で秒に変えたそれぞれの値を合算、これで差分の合計秒が出来ました。
最後にコメント文やテストコードを省いたものを載せておきます。
date_default_timezone_set( 'Asia/Tokyo' );
$dt = new DateTime('now');
$dt_2 = new DateTime('midnight first day of next month');
$d = $dt_2->diff($dt, true);
$test = get_object_vars($d);
$day = $test["d"] * 24 * 60 * 60;
$hour = $test["h"] * 60 * 60;
$minutes = $test["i"] * 60;
$second = $test["s"];
$difftime= $day + $hour + $minutes + $second;