Beachten Sie, dass Dauern Umwandlung von Tagen, Monaten enthalten, und/oder Jahre in einer Dauer wie Sekunden nicht genau durchgeführt werden, ohne zu wissen ein tatsächlicher Starttermin.
Für Beispiel
1 SEP 2010: +P1M2D means +2764800 seconds
1 OCT 2010: +P1M2D means +2851200 seconds
Das liegt daran, 30. September-Tage hat, und Oktober hat 31-Tage. Dasselbe Problem tritt bei der Konvertierung von Jahresintervallen aufgrund von Schaltjahren und Schaltsekunden auf. Leap-Years führen zu einer weiteren Komplexität der Monatsumrechnung, da der Februar in Schaltjahren einen Tag länger ist als sonst. Tage sind problematisch in Gebieten, in denen Sommerzeit praktiziert wird - eine Ein-Tages-Periode, die während des DST-Übergangs auftritt, ist tatsächlich 1 Stunde länger als es sonst sein würde.
Alles was gesagt wird - Sie können natürlich Werte, die nur Stunden, Minuten und Sekunden enthalten, in Werte komprimieren, die nur Sekunden enthalten. Ich würde vorschlagen, dass Sie einen einfachen Parser erstellen, um die Aufgabe zu erledigen (oder vielleicht einen regulären Ausdruck in Betracht ziehen).
Seien Sie sich der oben beschriebenen Gefahren bewusst - da sind Drachen. Wenn Sie mit Tagen, Monaten und/oder Jahren zu tun haben, müssen Sie einen der eingebauten Mechanismen verwenden, um die Mathematik für Sie im Kontext eines bekannten Datums/Zeitpunkts zu berechnen. Wie andere bereits erwähnt haben: Die DateInterval-Klasse ist in Kombination mit den Funktionen der DateTime-Klasse wahrscheinlich der intuitivste Weg, um damit umzugehen. Aber das ist nur in PHP Version 5.3.0 oder höher verfügbar.
Wenn Sie als v5.3.0 mit weniger arbeiten müssen, können Sie versuchen, etwas, um dieses kleine Juwel zu bauen:
$startDateTime = '19700101UTC';
$duration = strtotime($startDateTime.'+1Year1Day1Second') - strtotime($startDateTime);
print("Duration in Seconds: $duration");
strtotime
nicht direkt mit dem ISO 8601-Format arbeiten (zB P1Y1DT1S
.) , aber das Format, dass es tut verstehen (1Year1Day1Second
) ist nicht zu weit weg - es wäre eine ziemlich geradlinige Umwandlung. (ein bisschen "hacky" ... aber das ist PHP für dich).
viel Glück!
Eine sehr spät Vorsicht ... Umwandlung P1MT auf Sekunden unmöglich sein würde, es sei denn, Sie wissen, ob Sie einen Monat mit 28 konvertieren, 29, 30, oder 31 Tage. In diesem Fall können Sie P1YT nicht einmal in 365 Tage umwandeln, ohne jedes vierte Jahr falsch zu liegen. (Es gibt einen Grund, warum im Standard keine Intervalle in Tagen oder Sekunden angegeben sind.) – Bevan
@Bevan: Die Antwort von Lee geht damit ins Detail. TL; DR: Sie brauchen ein Startdatum. – berkes
Ahh - danke @berkes, habe ich vermisst, als wenn ich die Seite überflogen habe (ich habe es gefunden, während ich nach etwas gesucht habe, das nichts miteinander zu tun hat). – Bevan