2016-06-24 2 views
2

시간을 계산 (및 에코 아웃)하는 여기에 약간의 PHP 코드가 있습니다. 기간을 계산하는 방법을 선택하는 if/else가 있습니다. 한 가지 상황에서 결과를 출력하는 기간은 DateTime 객체이며 다른 하나는 DateInterval 객체입니다. 두 형식의 형식은 if/else 문 외부에서 수행됩니다.PHP DateTime 형식이 작동하지만 DateInterval 형식이 작동하지 않습니다.

계산이 제대로 작동하고 DateTime 개체의 서식이 제대로 작동하지만 DateInterval 개체의 서식이 꺼져 있습니다. 출력 시간 내에 백분율 기호를 표시합니다 (코드 블록 끝의 예).

2시 10분
2016년 6월 16일

퍼센트 : 아래

$time1 = new DateTime($row[0]); 
$time2 = new DateTime($row[1]); 

if ($time1 > $time2) { 
    $twentyFourHours = new DateTime('240000'); 
    $difference = $time1->diff($twentyFourHours); 
    $time2->add($difference); 
    $duration = $time2; // this is a DateInterval object 
} 

else { 
$duration = $time2->diff($time1); // This is a DateTime object 
     } 

echo $duration->format('%H:%I'); 
echo '<br>'; 
echo $row['2']; 
    } 

내가 무엇입니까 출력의 예입니다 (다른 모든 기간은 퍼센트 기호와 DateInterval 객체입니다) 12 : 0 %
2016년 6월 16일

3시 4분
2016년 6월 17일

퍼센트 12 : 0
내가 DateInterval 형식의 문서에 무엇을 말할 수에서 2016년 6월 17일

, 난 두 자리 시간, 두 자리 분 동안 제대로 서식을 설정하고 % ('%의 H : %의 I '), 출력은 그렇지 않은 것으로 보입니다. 나는 어리석은 뭔가를 간과하고 누군가가 내가 어디로 잘못 가고 있는지 지적 할 수 있다면 고맙겠습니다.

많은 감사!

답변

1

우선, 귀하의 설명과 완전히 다르게 작동합니다. 당신은 출력 개체의 형식 디버그 문을 배치 할 수 확인하기 위해 : 다른 블록의 코드가 DateInterval을 반환하면서 경우 블록에

echo 'Type: ', get_class($duration), '<br>'; 

echo $duration->format('%H:%I'); 
echo '<br>'; 
echo $row['2']; 

그래서 코드를 날짜 시간을 반환합니다.

이 문제가 발생하는 이유는 DateTime과 DateInterval이 서로 다른 형식 유형을 가지고 있기 때문입니다. DateTime은 실제로는 formatting symbols을 % 기호로 이스케이프해야하며 DateTime은 date function과 같은 형식 스타일을 사용합니다.

두 가지 방법으로 문제를 해결할 수 있습니다. 쉬운 방법은 필요한 형식을 저장하는 하나 이상의 변수를 추가하고 if 및 else 블록의 해당 값으로 설정하는 것입니다. 다시 말하면 $ duration을 만드는 코드를 다시 작성하십시오. 변수는 두 경우 모두 같은 유형입니다.

+0

머리를 주셔서 감사합니다. 나는 물어보기 전에 그것들을 뒤집어보고 확인해야만했다. 나는 print_r을 둘 다 실행 시켰고 명시된 바와 같이 그것을 맹세했지만 분명히 그렇게하지 않았습니다. 다음날 아침 더 명확하게 머리를 쳐다보아야했습니다. –

+0

두 시나리오 모두 조건부 서식을 사용하는 것과 동일한 유형의 개체를 출력하므로 나중에 문제가 발생할 수 있습니다. –

2

이것을 디버거에 넣고 $ time1이 (가) $ time2보다 2 시간 10 분 더 길어서 첫 번째 데이터 세트처럼 보였으 며 동일한 오류가 발생했습니다.

디버거에서 보았을 때 $ duration은 Duration 객체 대신 DateTime 객체였습니다. 구체적으로는

$duration = $time2; // this is a DateInterval object 

$ time2가 DateTime 개체이므로 $ duration이 DateTime 개체가되어 형식이 실패합니다.

그래서, 코드에서 : 당신이 $의 TIME2에 추가 한 후 $ 시간 1 자정 이후의 시간 기간을 점점하고있는 것처럼

// find the duration since midnight 
    $twentyFourHours = new DateTime('240000'); 
    $difference = $time1->diff($twentyFourHours); 

    // add that difference to time2...hmmm 
    $time2->add($difference); 

    // copy time2 to duration, this will copy the $time2 DateTime object 
    $duration = $time2; // this is a DateInterval object 

그것은 그 경우 오타이고, 나는 궁금 보인다 어디에서 다른 일을하려고하셨습니까? 희망이 도움이됩니다!

+1

감사합니다. 실제로 time1에서 time2까지의 시간 차이를 추가하고 싶습니다. 나는 그것들을 바꾸었고 포맷팅 문법이 같을 것이라고 생각했다. –

+0

좋아요! 다행 이군. – Katie

관련 문제