1. HOME
  2. PHP
PHP 公開

記事更新日

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;