HOWTO · PHP
PHP で分単位の時差を取得する方法
この記事では、PHP で時差を分単位で取得する方法を紹介しています。date_diff()関数や数式なども含まれています。
このページの内容
PHP の 2 つの日付時刻値の経過時間を分で求めるには、それぞれの Unix タイムスタンプを引き、秒数を 60 で割ります。所要時間を求める場合に適した方法です。暦上の期間を求めるには date_diff()、解析可能な文字列を入力に使うには strtotime() を使います。両方の値を同じタイムゾーンの前提で扱い、結果に時間の前後関係を残すか、絶対値にするかを決めてください。
タイムスタンプから経過分数を計算する
DateTimeImmutable を使うと入力値が明確になり、計算中にどちらの値も変更せずに済みます。両方の値にタイムゾーンを設定してください。例では UTC を使います。タイムスタンプの差は符号付きの経過秒数です。終了時刻が開始時刻より後なら正の値になり、符号は引き算の順序に従います。時間の前後関係が不要な場合に限り、差を abs() で囲みます。60 で割ると分の小数部分も保たれます。アプリケーションで整数の分が必要な場合にのみ、丸め関数を使ってください。
次の例を実行してください。コード内の出力ラベルは英語のままです。
<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-16 10:00:00', $timezone);
$elapsedMinutes = ($end->getTimestamp() - $start->getTimestamp()) / 60;
echo "Elapsed minutes: $elapsedMinutes\n";
夏時間の変更をまたぐ実際の経過時間を求めるには、意図したタイムゾーンを設定した日付時刻値からタイムスタンプを取得してください。夏時間を採用するタイムゾーンでは、暦上の 1 日が経過時間で常にちょうど 1,440 分になるとは限りません。
暦上の日付の差には date_diff() を使う
date_diff()($start->diff($end) としても利用できます)は、経過時間を分で表す単一の数値ではなく、DateInterval を返します。日、時、分の各要素は、「何日、何時間、何分離れているか」のように暦上の差を知りたい場合に役立ちます。終了時刻が開始時刻より前の場合は、invert プロパティで方向を確認できます。absolute 引数を使えば、その方向を無視できます。
コード内の出力ラベルは英語のままです。
<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-18 12:30:00', $timezone);
$interval = date_diff($start, $end);
echo $interval->format('%R%a days, %h hours, and %i minutes');
暦上の期間については、各要素を使って $interval->days * 1440 + $interval->h * 60 + $interval->i のような名目上の分数を計算できます。これは暦上の日数と時刻の要素を組み合わせた値です。タイムゾーンの移行をまたぐ正確な経過分数が必要な場合、タイムスタンプの引き算の代わりにはなりません。方向を残すには、期間の符号を維持するか、計算した絶対値に $interval->invert を適用してください。
strtotime() で時刻文字列を解析する
strtotime() は、解析可能な日付時刻文字列を Unix タイムスタンプに変換します。時刻だけの文字列は日付の文脈に基づいて解釈されるため、午前 0 時をまたぐ可能性がある場合や、異なる日付に属する値を比べる場合は、完全な日付を指定してください。既定のタイムゾーンを明示するか、各文字列にタイムゾーンを含め、両方のタイムスタンプが意図した文脈で扱われるようにします。次の引き算は符号を保持します。符号なしの所要時間にするには abs() を使ってください。
コード内の出力ラベルは英語のままです。
<?php
date_default_timezone_set('UTC');
$start = strtotime('2024-06-16 23:30:00 UTC');
$end = strtotime('2024-06-17 00:15:00 UTC');
$minutes = ($end - $start) / 60;
echo "Elapsed minutes: $minutes\n";
信頼できない入力や形式が一定しない入力を解析する場合は、引き算の前に各呼び出しがタイムスタンプを返したことを確認してください。解析に失敗すると false が返ることがあります。タイムゾーンを明確に扱う必要があるアプリケーションデータには、明示的なタイムゾーンを指定して DateTimeImmutable の値を作る方法が適しています。簡潔に解析するには strtotime()、経過時間を求めるにはタイムスタンプの引き算、暦上の期間そのものを説明するには date_diff() を使い分けてください。