2012-12-10 3 views
1

기본적으로 남은 시간이 만료되기를 원합니다. 5.2.x (5.2.17) : 나는 어떻게 PHP에서 뭔가를 할 수 유닉스 시간을 DateTime으로 변환 개체 : PHP 5.2.X

$now = new DateTime(); $future_date = new DateTime($enddate); $interval = $future_date->diff($now,false); // ->diff will not work on 5.2.x $interval->format("%d d, %h h, %i m"); 

미만으로 PHP 5.3.x에서 쉽게했다.

내가 뭘하려 :

new DateTime(date('Y-m-d H:i:s', $now->format('U') - $future_date->format('U'))); 

이 예상 된 결과를 제공하지 않습니다.

+0

당신은 여기 댓글에 몇 가지 솔루션에 모습을 가질 수있다 : http://php.net/manual/en/function.date-diff.php –

답변

3

는 PHP < 5.3 있기 때문에 DateInterval 클래스를 지원하지 않습니다 (이 작업을 수행 할 수있는 권리 방법입니다) DateTime::diff() 사용할 수 없습니다. 5.2.x에서 작동하려면이 작업을 수동으로 수행해야합니다.

수학은 실제로 매우 간단합니다 : 그것은 윤년을 고려하지 않기 때문에

// Get the difference between the two dates, in seconds 
$diff = $future_date->format('U') - $now->format('U'); 

// Calculate the days component 
$d = floor($diff/86400); 
$diff %= 86400; 

// Calculate the hours component 
$h = floor($diff/3600); 
$diff %= 3600; 

// Calculate the minutes component 
$m = floor($diff/60); 

// Calculate the seconds component 
$s = $diff % 60; 

// $d, $h, $m and $s now contain the values you want, so you can just build a 
// string from them 
$str = "$d d, $h h, $m m, $s s"; 

그러나 큰 간격이, 부정확를 소개합니다. 즉, 몇 초 안에 끝날 수도 있지만 원래 형식 문자열에는 초 구성 요소가 포함되어 있지 않으므로이 작업을 수행하는 데 너무 많은 문제가 발생할 수 있습니다.

$future_date에서 $now을 뺄 필요가 있습니다. 그렇지 않으면 결과가 부정됩니다. 내가 시도 무엇

See it working

1

가 작동하는 것 같다 지금까지 멀리 당신은 노력이 것과되지 않습니다 : 당신은 쉽게 다음 DateTimedate() 변환 할 수

echo $now = date('Y-m-d H:i:s'); 
echo PHP_EOL; 
echo $future = date('Y-m-d H:i:s', strtotime('today + 3 days')); 
echo PHP_EOL; 
echo date('d', (strtotime("{$future}") - strtotime("{$now}"))); 

확인 http://codepad.org/JbaJ3EGH

. 또한 "3 일 간격"을 날짜로 포맷하면 "1970-01-01 00 : 00 : 00.000"날짜가됩니다. 빼는 날짜에서 일, 시간, 분 또는 달만 가져 오는 것이 좋습니다.

+0

이는 1 개월 미만의 간격으로 작동 것이다, 도약 부정확성이 여전히 남아 있습니다 (5.2에서 피할 수없는 것 같지만) – DaveRandom

+0

@DaveRandom 예, 따라서 'days'의 차이 만 나타납니다.날짜가 1 개월 이상인 경우 '개월'차이를 얻는 데 필요하며 개월을 빼고 날짜 차이를 가져옵니다. 그래, 나는 그것이 올바른 접근 방식이 아니라고 고백하고 당신의 대답은 훨씬 더 좋다! – shadyyx

+0

나는이 "올바른"접근 방식이 있다고 생각하지 않습니다. 당신의 대답은 잘못이 아니며 비판도 아닙니다. 나는 교활한 계획의 결함을 지적하고 있습니다. 내 흠도있다. 내가 당신에게 부여 할이 맛있는 +1을 즐겨라. – DaveRandom

0

$h === 1 ? true : false;

이 경우에도 var_dump($h) 인쇄 1 false를 반환합니다 그래서, DaveRandom의 매우 도움이 대답에, 값이 floor() 수레 (더블)이다에서 반환, 알고 유용 할 수 있습니다.

당신이 값이 정수되는 확인해야하는 경우

그들에게 할당 할 때, 정수로 캐스팅 (이 값은 시간 단위의 단수 및 복수 버전 문자열을 만들 때 1 또는 1보다 큰되는 확인하기 위해 필요하다고) :

$h = (int) floor($diff/3600);

관련 문제