HOWTO · PHP
PHP에서 시간 차이를 분 단위로 얻는 방법
이 기사에서는 PHP에서 시간 차이를 분 단위로 얻는 방법을 소개합니다. date_diff() 함수와 수학 공식이 포함됩니다.
이 페이지의 내용
PHP 날짜·시간 값 두 개 사이의 경과 시간을 분으로 구하려면 Unix 타임스탬프를 빼고 초 단위 차이를 60으로 나눕니다. 경과 시간이 필요할 때 이 방법을 사용하세요. 달력상의 간격이 필요하면 date_diff()를, 입력값이 파싱 가능한 문자열이면 strtotime()를 사용하세요. 두 값에 동일한 시간대 맥락을 적용하고, 결과에 방향을 나타내는 부호를 유지할지 절댓값으로 나타낼지 결정하세요.
타임스탬프에서 경과 시간을 분으로 계산하기
DateTimeImmutable를 사용하면 입력값을 명확히 지정할 수 있고 계산 중 어느 값도 변경하지 않습니다. 두 값 모두에 시간대를 설정하세요. 아래 예제에서는 UTC를 사용합니다. 타임스탬프를 빼면 부호가 있는 경과 시간(초)이 계산되므로 종료 시각이 더 늦으면 양수가 되고, 부호는 뺄셈 순서에 따라 달라집니다. 방향이 중요하지 않을 때만 차이에 abs()를 적용하세요. 60으로 나누면 소수 분 단위 결과가 유지됩니다. 애플리케이션에서 정수 분이 필요한 경우에만 반올림 함수를 사용하세요.
다음 예제를 실행해 보세요. 출력에 표시되는 Elapsed minutes: 레이블은 바이트 단위 일치 규칙에 따라 영어로 유지됩니다.
<?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,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 타임스탬프로 변환합니다. 시간만 있는 문자열은 날짜 맥락을 기준으로 해석되므로 자정을 넘기거나 서로 다른 날짜에 속할 수 있는 값을 비교할 때는 전체 날짜를 제공하세요. 기본 시간대를 명시적으로 설정하거나 각 문자열에 시간대를 포함해 두 타임스탬프가 의도한 맥락을 사용하도록 하세요. 아래 뺄셈은 부호를 유지합니다. 부호 없는 경과 시간이 필요하면 abs()를 사용하세요.
출력에 표시되는 Elapsed minutes: 레이블은 바이트 단위 일치 규칙에 따라 영어로 유지됩니다.
<?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()를 사용하세요.