[php] PHP에서 두 datetime 사이의 간격 초를 얻습니까?

2009-10-05 18:11:08

2009-10-05 18:07:13

이것은 235를 생성해야합니다. 어떻게하나요?



답변

이를 위해 strtotime () 을 사용할 수 있습니다 .

$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')

비슷한 접근 방식이 DateTime 객체로 가능합니다.

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diff = $date2->getTimestamp() - $date->getTimestamp();


답변

DateTime 개체를 사용하면 다음과 같이 할 수 있습니다.

$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );

$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();


답변

PHP 날짜 시간 참조는 다음과 같은 경우에 유용합니다. PHP 날짜 시간 함수

strtotime () 이 아마도 가장 좋은 방법 일 것입니다.

$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')


답변

유닉스 시대의 제한으로 인해 1970 년 이전과 2038 년 이후의 날짜를 비교하는 데 문제가있을 수 있습니다. 저는 정밀도를 느슨하게 선택하고 (= 1 초를 보지 않음) unix 시대 변환 (getTimestamp)을 통과하지 않도록 선택합니다. 당신이 무엇을하는지에 따라 다릅니다.

제 경우에는 365 (12 * 30)를 사용하고 평균 월 길이로 “30”을 사용하면 사용 가능한 출력에서 ​​오류가 감소했습니다.

function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
    $diff = $end->diff($start);
    $diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
                ($diff->s)+ // seconds (no errors)
                (60*($diff->i))+ // minutes (no errors)
                (60*60*($diff->h))+ // hours (no errors)
                (24*60*60*($diff->d))+ // days (no errors)
                (30*24*60*60*($diff->m))+ // months (???)
                (365*24*60*60*($diff->y)) // years (???)
                );
    return $diff_sec;
}

“평균”수량이 차이에 대한 의도 인 경우 오류는 0 일 수 있습니다. PHP 문서는 이것에 대해 말하지 않습니다 … 나쁜 경우 오류는 다음과 같습니다.

  • 1 개월 미만의 시간 간격에 diff가 적용되는 경우 0 초
  • 1 개월을 초과하는 시간차에 diff가 적용되는 경우 0 ~ 3 일
  • 1 년을 초과하는 시간 간격에 diff가 적용되는 경우 0 ~ 14 일

나는 누군가가 “m”을 30 일로, “y”를 365로 간주하고 “diff”가 30 일이 아닌 달을 걸을 때 차이를 “d”로 청구했다고 가정하는 것을 선호합니다.

누군가 이것에 대해 더 알고 있고 공식 문서를 제공 할 수 있다면 환영합니다!


답변

strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")


답변

실제 현지 시차가 필요하고으로 작업하려는 getTimestamp경우 계산 된 기간 동안 DST 스위치를 고려해야합니다. 따라서 UTC에 대한 로컬 오프셋이 방정식에 포함되어야합니다.

예를 들어 다음 날짜를 고려하십시오.

$tz = new \DateTimeZone("Europe/Berlin");
$start = new \DateTime("2018-02-01 12:00:00", $tz);
$end = new \DateTime("2018-04-01 12:00:00", $tz);

$startUTC로 “2018-02-01 11:00:00″이고 UTC $end로 “2018-04-01 10:00:00″입니다. 베를린 시간대에서는 시간이 동일하지만 UTC에서는 다릅니다. UTC 오프셋은에서 1 시간,에서 $start2 시간입니다 $end.

getTimestamp항상 UTC를 반환 한다는 점을 명심하십시오 ! 따라서 실제 로컬 차이를 찾을 때 타임 스탬프에서 오프셋을 빼야합니다.

// WRONG! returns 5094000, one hour too much due to DST in the local TZ
echo $end->getTimestamp() - $start->getTimestamp();

// CORRECT: returns 5090400
echo ($end->getTimestamp() - $end->getOffset()) - ($start->getTimestamp() - $start->getOffset());


답변

타임 스탬프 사용의 한계 (즉, 1970 년 이전과 2038 년 이후의 날짜 사용)에 대해 걱정하는 사람들을 위해 다음과 같이 간단히 초 단위의 차이를 계산할 수 있습니다.

$start = new DateTime('2009-10-05 18:11:08');
$end = new DateTime('2009-10-05 18:07:13');
$diff = $end->diff($start);

$seconds = ($diff->format('%r%a') * 24 * 60 * 60)
    + $diff->h * 60 * 60
    + $diff->i * 60
    + $diff->s;

echo $seconds; // output: 235

블로그 게시물 더 읽기에 관심이있는 사람들을 위해입니다.