PHP で日付や時刻を取得するには、date()関数やstrtotime()関数、DateTimeクラスやDateTimeImmutableクラスを用いると思います。
今回は、strtotime()関数とDateTimeImmutableクラスの処理速度を比較していきます。
DateTimeImmutableとは
DateTimeImmutableは日付や時刻を表すことができるクラスです。
DateTimeImmutableクラスで日付や時刻を取得するには、オブジェクトを作成します。
DateTimeImmutableクラスはDateTimeクラスとほぼ同じですが、 DateTimeImmutableクラスでは、作成したオブジェクトをメソッドで扱う際に、元のオブジェクトは変更せずに新しいオブジェクトを返します。
詳細はこちらをご覧ください。
使用例
下記を2021年6月28日の15時30分に実行します。
<?php
$datetime = new DateTimeImmutable('now', new DateTimeZone('Asia/Tokyo'));
echo $datetime->format('Y-m-d H:i:s'); //2021-06-28 15:30:24
strtotimeとは
strtotimeは指定日時をUnix タイムスタンプに変換するメソッドです。
Unix タイムスタンプの詳細に関してはこちらをご覧ください。
使用例
<?php
$unix_time = strtotime("2021-06-28 15:30:24");
echo $unix_time; //1624894224
実際にやってみる
今回は2021年4月18日21時15分42秒のUnix タイムスタンプと2021年4月18日21時25分32秒のUnix タイムスタンプの差を出す処理を10万回ループさせて実行速度を比較します。
<?php
//DateTimeImmutableの場合
$time_start = microtime(true);
$count = 0;
while($count <= 100000) {
$datetime01 = new DateTimeImmutable("2021-04-18 21:15:42");
$datetime02 = new DateTimeImmutable("2021-04-18 21:25:32");
$diff = $datetime01->getTimestamp() - $datetime02->getTimestamp();
$count++;
}
$time = microtime(true) - $time_start;
echo "{$time} 秒";
//strtotimeの場合
$time_start2 = microtime(true);
$count = 0;
while($count <= 100000) {
$unix_time01 = strtotime("2021-04-18 21:15:42");
$unix_time02 = strtotime("2021-04-18 21:25:32");
$diff2 = $unix_time01 - $unix_time02;
$count++;
}
$time2 = microtime(true) - $time_start2;
echo "{$time2} 秒";
結果
0.51721596717834 秒
0.29946088790894 秒
結果としては、strtotimeの方が実行速度が早く、10万回繰り返すと約0.2秒の差が生じることがわかりました。
ちなみに、DateTimeImmutableクラスにはふたつのDateTimeオブジェクトの差を返すdiff()関数というものがあるのでそちらの処理速度も出してみます。
<?php
$time_start1 = microtime(true);
$count = 0;
while($count <= 100000) {
$datetime1 = new DateTimeImmutable("2021-04-18 21:15:42");
$datetime2 = new DateTimeImmutable("2021-04-18 21:25:32");
$diff1 = $datetime1->diff($datetime2);
$durationInSeconds = ($diff1->s)
+ ($diff1->i * 60)
+ ($diff1->h * 60 * 60)
+ ($diff1->d * 60 * 60 * 24)
+ ($diff1->m * 60 * 60 * 24 * 30)
+ ($diff1->y * 60 * 60 * 24 * 365);
$count++;
}
$time1 = microtime(true) - $time_start1;
echo "{$time1} 秒";
結果
0.52968621253967 秒
DateTimeImuutableのgetTimestamp()メソッドを使った処理とそこまで差がないことがわかりました。
参考サイト: