PHP DateInterval에서 총 초 계산


99

두 날짜 사이의 총 시간 (초)을 계산하는 가장 좋은 방법은 무엇입니까? 지금까지 다음과 같은 내용을 시도했습니다.

$delta   = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;

그러나 daysDateInterval 객체 의 속성은 현재 PHP5.3 빌드에서 손상된 것 같습니다 (적어도 Windows에서는 항상 동일한 6015값을 반환 함 ). 나는 또한 매월 일수 (반올림 30), 윤년 등을 보존하지 못하는 방식으로 시도했습니다.

$seconds = ($delta->s)
         + ($delta->i * 60)
         + ($delta->h * 60 * 60)
         + ($delta->d * 60 * 60 * 24)
         + ($delta->m * 60 * 60 * 24 * 30)
         + ($delta->y * 60 * 60 * 24 * 365);

하지만 저는이 반쪽짜리 솔루션을 사용하는 것이 정말 만족스럽지 않습니다.


결과는 $delta->format("%r%s")무엇입니까?
warrenm 2010

1
@warrenm 문제 format는 초가 0이고 분이 1이면 $delta->format("%r%s")0으로 판명 될 때입니다. :(
Vadim Samokhin aug

4
더 나쁜 것은 위의 정확한 코드를 붙여 넣은 코더의 코드 검토에서 발견 된 결함을 수정하는 누군가입니다. 매월 30 일이 아니라 매년 365 일이 아닙니다. :) [편집 : 그리고 그 코더는
나일

답변:


205

대신 타임 스탬프 를 비교할 수 없습니까?

$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()

11
RTFM을하지 않은 것 같아요 ... 이것이 제가 찾고 있던 것입니다. 감사합니다!
efritz 2010

3
+1 : 멋지고 깨끗합니다! 참고 getTimestamp()방법은 PHP> = 5.3.0에서 사용할 수 있습니다.
Sk8erPeter

6
당신의 엉터리 공유 호스팅에 PHP 5.2 나왔습니다 붙어 당신이 경우, 사용 format('U')대신에 getTimestamp().
chiborg

4
솔루션이 2038 년 버그와 호환되지 않습니다
Jack M.

9
@JackM. 알아 둘만 한. 현재 구축중인 모든 것이 2037 년에 더 이상 실행되지 않기를 바랍니다. 2038 년 버그 안전 대안 솔루션을 자유롭게 제공하십시오.
Ben

34

이 함수를 사용하면 DateInterval 객체에서 총 기간 (초)을 가져올 수 있습니다.

/**
 * @param DateInterval $dateInterval
 * @return int seconds
 */
function dateIntervalToSeconds($dateInterval)
{
    $reference = new DateTimeImmutable;
    $endTime = $reference->add($dateInterval);

    return $endTime->getTimestamp() - $reference->getTimestamp();
}

2
DateTimeImmutable은 PHP 5.5 이상에서만 사용할 수 있습니다.
hschmieder

난 당신이 반환 변수를 교체해야 생각 $endTime하고 $reference이 나에게 날짜 값 간격 미래와 마이너스 결과를 제공하기 때문에, 서로를.
AlexioVay

타임 스탬프도 초 단위라고 생각하지 않습니다. PHP DateTime =
Horrific

5

다음과 같이 할 수 있습니다.

$currentTime = time();
$timeInPast = strtotime("2009-01-01 00:00:00");

$differenceInSeconds = $currentTime - $timeInPast;

time ()은 epoch 시간 (1970-01-01T00 : 00 : 00) 이후 현재 시간을 초 단위로 반환하고 strtotime은 동일한 작업을 수행하지만 사용자가 제공 한 특정 날짜 / 시간을 기반으로합니다.


4
static function getIntervalUnits($interval, $unit)
{
    // Day
    $total = $interval->format('%a');
    if ($unit == TimeZoneCalc::Days)
        return $total;
    //hour
    $total = ($total * 24) + ($interval->h );
    if ($unit == TimeZoneCalc::Hours)
        return $total;
    //min
    $total = ($total * 60) + ($interval->i );
    if ($unit == TimeZoneCalc::Minutes)
        return $total;  
    //sec
    $total = ($total * 60) + ($interval->s );
    if ($unit == TimeZoneCalc::Seconds)
        return $total;  

    return false;
}

0

때 그것은 항상 좋은 느낌 무엇을 당신이 필요로하는 것은 이미 클래스로 존재한다. 귀하의 경우 총 시간 (초)이 필요합니다. 그것으로 수업을 만들어 보지 않겠습니까? 코드는 다음과 같습니다.

(new TotalFullSeconds(
    new IntervalFromRange(
        new DateTimeFromISO8601String('2017-07-03T14:27:39+00:00'),
        new DateTimeFromISO8601String('2017-07-05T14:27:39+00:00')
    )
))
    ->value()

직관적 일뿐만 아니라 IDE의 자동 완성 기능을 활용할 수도 있습니다.

보다 유용한 구현을 위해이 라이브러리를 확인할 수 있습니다 .


-8

딱딱한 숫자 (60 * 60 대신-3600에 넣음)를 입력하면 매번 계산할 필요가 없습니다.

편집-귀하의 의견에 따라 번호를 수정했습니다.


그것은 괜찮을 것이고 아마도 PHP에서 몇 분의 1 초 더 빨리 실행될 것이지만 여전히 위의 예제와 같은 계산 오류를 남깁니다.
efritz 2010
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.