文字列操作と数学を備えた古い学校:
$input = '22:00 - 06:00';
preg_match('/(\d+):(\d+)\D*(\d+):(\d+)/', $input, $matches);
list(, $startHour, $startMin, $endHour, $endMin) = $matches;
$totalMinutes = ($endHour * 60 + $endMin - $startHour * 60 + $startMin + 1440) % 1440;
$hours = floor($totalMinutes / 60);
$mins = $totalMinutes % 60;
echo "works for $hours hours, $mins minutes";
日付/時刻機能付き:
$input = '22:00 - 06:00';
list($start, $end) = array_map('trim', explode('-', $input));
$start = new DateTime($start.'+00:00');
$end = new DateTime($end.'+00:00');
if ($start > $end) $start->sub(new DateInterval('P1D'));
$interval = $end->diff($start);
echo "works for ".$interval->h." hours, ".$interval->m." minutes";
日付/時刻関数を使用するソリューションの悪魔の落とし穴:
$start
とのオフセットを明示的に指定せず$end
、夜勤について話している場合、夏時間が開始または終了する日にコードが実行されると、DSTオフセットが何であれ結果がずれます。
DateTime
これは、、strtotime
などを使用するすべてのソリューションに当てはまります。