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);
$start
UTC로 “2018-02-01 11:00:00″이고 UTC $end
로 “2018-04-01 10:00:00″입니다. 베를린 시간대에서는 시간이 동일하지만 UTC에서는 다릅니다. UTC 오프셋은에서 1 시간,에서 $start
2 시간입니다 $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
쓴 블로그 게시물 더 읽기에 관심이있는 사람들을 위해입니다.