development

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

big-blog 2020. 12. 13. 10:10
반응형

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;
}

"평균"수량이 diff에 해당하는 경우 오류는 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());

간단하고 정확한 솔루션 (Nilz11의 설명 예시) :

$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 + 
   $diff->format("%i")) * 60 + $diff->format("%s");

참고 URL : https://stackoverflow.com/questions/1519228/get-interval-seconds-between-two-datetime-in-php

반응형