2013-06-11 2 views
1

이 스크립트는 일치하지 않는 일 수를 반환합니다. localhost에서 클라이언트 서버에서 14 일을 반환하면 15 일을 반환합니다.PHP에서 일치하지 않는 일 계산

$_POST['pickup_time'] = '13:30'; 
    $_POST['dropoff_time'] = '12:00'; 
    $_POST['pickup_date'] = '2013-10-16'; 
    $_POST['dropoff_date'] = '2013-10-30'; 


    $fmt_pickup_date = strtotime($_POST['pickup_date']); 
    $fmt_dropoff_date = strtotime($_POST['dropoff_date']); 

    $days = ceil(abs($fmt_dropoff_date - $fmt_pickup_date)/86400); 

    if ($vehicles[$v]['vehicle_cal_date']==0) 
    { 
     $fmt_pickup_time = str_replace(":", "", $_POST['pickup_time']); 
     $fmt_dropoff_time = str_replace(":", "", $_POST['dropoff_time']); 

     if (($fmt_dropoff_time-$fmt_pickup_time)>=1) 
     { 
      $days++; 
     } 
    } 
    else { $days++; } 

일부 날짜는 올바른 날 수와 틀린 날 (+1 일)을 반환합니다.

[pickup_time] => 11:00 
    [dropoff_time] => 10:00 
    [pickup_date] => 2013-10-28 
    [dropoff_date] => 2013-11-01 

이 날짜는 두 서버에서 모두 4 일 동안 반환됩니다.

아이디어가 있으십니까? 뭐가 잘못 되었 니?

편집 :

date_default_timezone_set('UTC'); 

수정 문제와 현재 스크립트가 올바른 일 두 날짜를 계산 반환

것으로 보인다. 얼마나 오래 - 전혀 모르겠다. 나는 이것이 모든 날짜에 대해 고칠 것이라고 희망한다 :

+2

사용중인 서버가 어떤 시간대에 구성되어 있습니까? 어쩌면 그들은 다른 날짜가있을 것입니다. –

+0

당신은 정말로 문자열에 '수학'을해서는 안됩니다. '13 : 30' -'12 : 00'이 효과가 있을지 모르지만, 당신이하고있는':'=> 빈 문자열 교체로도 여전히 엉뚱한 편입니다. 왜이 모든 '수학'을하기 위해 제공된 PHP DateTime 클래스를 사용하지 않습니까? –

+0

'vehicle_cal_date'변수에 차이가 있습니까? 이것이 일을 일으킬 수있는 ++? – Egari

답변

1

이것은 로컬 호스트와 클라이언트 서버의 PHP 설정의 차이와 관련이있을 수있다. 과거에 내가 한 일은 phpinfo()와 각각 비교하여 문제가 어디에 있는지 파악합니다. 어쩌면 PHP에 대한 날짜 구성?

+0

이 답변은 반드시 틀린 것은 아니지만 Qualcuno의 dead-on 대답과 비교했을 때 일반적인 추측입니다.이 대답은 거의 질문에 대한 언급 일 수 있습니다. – mickmackusa

+0

동의 한 @mickmackusa. 나는 이것을 대답으로 올렸을 때 여전히 멍청했다. – tjfo

1

PHP가 이미하는 일을하기 위해 자신의 코드를 사용하지 마십시오.

이 시도 :

$datetime1 = new DateTime('2013-10-28'); 
$datetime2 = new DateTime('2013-11-01'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 

를 출력 사일된다.

희망이 여기에 당신에게

을하는 데 도움이 날짜 기능에 대한 공식 문서이며 모든 당신은 그들과 함께 작업을 수행 할 수 있습니다 http://php.net/manual/en/datetime.diff.php

2

문제는 정말 간단합니다, 그리고 내가 반복했던 하나 오랜 시간 동안 ... 그리고 물론 당신이 시간대를 UTC로 설정하면 작동합니다!

왜?

단순히 DST 때문입니다. DST가 시작되거나 끝나면 24 시간이 걸리지 않습니다 (단, 23 일 또는 25 일). 따라서 24 시간 인 86400 초의 수학을 수행하면 효과가 없습니다!

DST를 사용하지 않는 시간대를 UTC로 설정하는 것이 좋습니다. 그러나 제 생각에 가장 깨끗한 솔루션은 DateTime 클래스를 사용하여 수학을 수행하는 것입니다. http://php.net/datetime 이러한 함수는 표준 시간대를 지원하므로 DST를 올바르게 처리합니다.

+0

@notneededanymore이 답변은 말 그대로 당신의 질문에 훌륭하게 대답합니다. 녹색 진드기를 수여하십시오. sandino, 당신이 아직하지 않은 경우에, 당신이 당신의 경우에 가능한 한 최단의 솔루션을 제공했기 때문에 upvote를 받아야합니다. – mickmackusa