2016-06-24 7 views
2

Ich habe ein bisschen PHP-Code hier, der eine Zeitdauer berechnet (und ausgibt). Ich habe ein if/else, das wählt, wie man die Dauer berechnet. Aufgrund der Art und Weise, wie ich die Berechnungen durchgeführt habe, ist unter einem Umstand die Dauer, die ausgegeben wird, ein DateTime-Objekt, unter der anderen ist es ein DateInterval-Objekt. Die Formatierung von beiden erfolgt außerhalb der if/else-Anweisung.PHP DateTime-Formatierung funktioniert, aber DateInterval-Formatierung funktioniert nicht

Die Berechnungen funktionieren einwandfrei, und die Formatierung für das DateTime-Objekt funktioniert einwandfrei, aber die Formatierung für das DateInterval-Objekt ist deaktiviert. Es zeigt Prozentzeichen innerhalb der Ausgabezeit (Beispiel am Ende des Codeblocks).

$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']; 
    } 

Im Folgenden ein Beispiel für die Ausgabe ist ich erhalte (jede zweite Dauer ist das DateInterval Objekt mit den Prozentzeichen):

02:10
2016-06-16

% 12:% 0
2016-06-16

03:04
2016-06-17

% 12:% 0
2016-06-17

Von dem, was ich in der DateInterval Formatierung docs sagen kann, ich die Formatierung korrekt H bin Einstellung für zweistellige Stunden und Minuten zweistellig ('%:% I '), aber die Ausgabe scheint das Gegenteil zu beweisen. Ich vermute, ich übersehe etwas albern und wäre dankbar, wenn jemand darauf hinweisen könnte, wo ich falsch liege.

Vielen Dank!

Antwort

1

Zunächst einmal funktioniert es völlig anders als Ihre Erklärung. Um zu überprüfen, eine Debug-Anweisung für die Ausgabe die Art des Objekts kann verwendet werden:

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

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

So Code in if-Block gibt Datetime, während Code in anderen Block DateInterval zurückgibt.

Der Grund, warum Sie das Problem haben, ist einfach, dass Datetime und DateInterval verschiedene Formattypen haben, DateInterval in der Tat mit einem% -Zeichen all formatting symbols während Datetime verwendet die gleichen Formatvorlagen wie date function zu entkommen erfordert.

Ich sehe zwei Möglichkeiten, um ein Problem zu beheben: einfach ist nur eine weitere Variable einzuführen, die ein notwendiges Format speichert und es auf einen entsprechenden Wert in if und else blockiert, eine andere Möglichkeit - schreiben Sie Code um $ duration zu machen Variable haben in beiden Fällen den gleichen Typ.

+0

Danke für die Köpfe hoch. Ich hätte versuchen sollen, sie umzukehren und zu überprüfen, bevor ich hier frage. Ich habe eine print_r auf beiden und ich hätte schwören können, dass es wie gesagt war, aber offensichtlich war es nicht so. Hätte es am nächsten Morgen besser sehen sollen. –

+0

Ich werde damit arbeiten, dass beide Szenarien den gleichen Typ von Objekt ausgeben, wie bedingte Formatierung wird mich später auf der Straße durcheinander bringen. –

2

Ich legte dies in meinem Debugger und richten Sie es so, dass $ time1 um 2 Stunden und 10 Minuten größer als $ time2 war, die wie Ihr erster Datensatz aussah und den gleichen Fehler bekam.

Beim Anzeigen im Debugger war $ duration ein DateTime-Objekt anstelle eines Duration-Objekts. Im Einzelnen:

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

$ time2 ist ein Datetime-Objekt, so wurde $ Dauer ein Datetime-Objekt und damit das Format nicht.

Also, in Ihrem Code:

// 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 

Es sieht aus wie Sie die Zeitdauer seit Mitternacht für $ time1 bekommen, und das Hinzufügen es dann zu $ ​​zeit2, ich frage mich, ob das ist, wo die Tippfehler , wo du etwas anderes machen wolltest? Ich hoffe, das hilft!

+1

Danke für die Info. Ich wollte eigentlich den Zeitunterschied von Zeit1 zu Zeit2 hinzufügen. Ich ließ sie umschalten UND ich nahm an, dass die Formatierungssyntax die gleiche wäre. –

+0

Großartig! Ich bin froh, dass Sie es behoben haben. – Katie