2016-06-24 9 views
2

ここでは、時間を計算する(そしてエコーアウトする)PHPコードがあります。期間を計算する方法を選択するif/elseがあります。ある状況下では、出力される期間はDateTimeオブジェクトであり、もう1つはDateIntervalオブジェクトです。両方の書式設定はif/else文の外側で行われます。PHPのDateTimeの書式設定は機能しますが、DateIntervalの書式設定は機能しません。

計算が正常に動作していて、DateTimeオブジェクトの書式設定は正常に機能していますが、DateIntervalオブジェクトの書式設定はオフです。出力時間内のパーセント記号(コードブロックの最後の例)を示します。以下は

$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オブジェクトである)私は取得しています出力の例を示します。

2時10分
2016年6月16日

% 12:%0

2016年6月16日午前3時04分


2016年6月17日

% 12:私は2桁の時間と2桁の分、正しくフォーマットを設定しています、DateIntervalフォーマットのドキュメントに伝えることができるものから、%0
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がdate functionと同じ書式スタイルを使用しているが、DateIntervalは確か%-signすべてformatting symbolsでエスケープする必要があります。

問題を解決するには2つの方法があります:必要なフォーマットを格納する変数をもう1つ導入し、それをifブロックとelseブロックの対応する値に設定することです。変数はどちらの場合も同じ型を持ちます。

+0

ヘッドアップありがとう。私はそれらを逆転させようとし、ここで尋ねる前に確認しておきました。私は両方でprint_rを実行し、それが明記されていたと誓っていたかもしれませんが、明らかにそうではありませんでした。翌朝明瞭な頭でそれを見ていたはずです。 –

+0

私はそれを使って、両方のシナリオが同じタイプのオブジェクトを出力するようにします。条件付き書式設定は後で道を邪魔します。 –

2

これをデバッガに入れて、$ time1が$ time2より2時間10分早くなるように設定しました。これは最初のデータセットのように見え、同じエラーが発生しました。

デバッガで見ていると、$ durationはDurationオブジェクトの代わりにDateTimeオブジェクトでした。具体的に:$期間はDateTimeオブジェクトになったので、フォーマットが失敗したので

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

$のTIME2は、DateTimeオブジェクトです。あなたのコード中のSO

、:

// 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のために午前0時からの継続時間を取得した後、$の時間2に追加されているように見えますあなたは何か他のことをするつもりでしたか?希望が助けてくれる!

+1

ありがとうございました。私は実際にtime1からtime2までのtime diffを追加したいと思っていました。私はそれらを切り替えて、私は書式設定の構文が同じであると仮定しました。 –

+0

素晴らしい!あなたはそれを固定してうれしいです。 – Katie

関連する問題