Umgang mit Daten und Zeiten in jeder Programmiersprache ist oft eine einfache und triviale Aufgabe, bis die Zeitzone unterstützt werden muss. Glücklicherweise verfügt PHP über eine Reihe leistungsstarker Datums-/Uhrzeit-Tools, mit denen Sie mit verschiedenen zeitlichen Problemen umgehen können: UNIX-Zeitstempel, Formatdaten für menschliches Lesen, Anzeigendaten mit Zeitzonen, berechnen Sie den Zeitunterschied zwischen jetzt und dem zweiten Dienstag des nächsten Monats und mehr. In diesem Artikel werden die Zeitfunktionen von PHP (time()
, mktime()
und date()
) und ihre objektorientierten Gegenstücke vorgestellt und dann etwas über MySQL-Daten erfahren und Ihnen zeigen, wie sie mit PHP perfekt zusammenarbeiten können.
Hauptgewinne
time()
, mktime()
und date()
handhaben. DateTime
und DateTimeZone
für objektorientierte Datums- und Uhrzeitoperationen, einschließlich der Behandlung verschiedener Zeitzonen. Php Datum und Zeitfunktion
Der größte Teil dieses Artikels verwendet die Unix -Zeit, auch als POSIX -Zeit oder Epochenzeit bezeichnet. Die Zeit wird ausgedrückt, wenn die Anzahl der Sekunden seit Mitternacht UTC am 1. Januar 1970 abgelaufen ist. Wenn Sie an der gesamten Geschichte der Unix -Zeit interessiert sind, lesen Sie den Artikel von Unix Time über Wikipedia. UTC (koordinierte universelle Zeit), auch als GMT bekannt, ist die Zeit der 0-Grad-Längengradlinie. Alle anderen Zeitzonen der Welt werden als positive oder negative Offsets in Bezug auf diese Zeit dargestellt. Durch die Verwendung von UTC und Unix Time to zu verarbeiten, erleichtert Ihr Leben, wenn Sie Zeitzonen verarbeiten müssen. Ich werde später ausführlich darauf eingehen, aber vorerst ignorieren wir das Zeitzonenproblem und sehen uns einige Zeitfunktionen an.
Holen Sie sich die aktuelle Unix -Zeit
time()
akzeptiert keine Parameter und gibt die Anzahl der Sekunden seit der UNIX -Epoche zurück. Um dies zu veranschaulichen, werde ich die Php Interactive CLI Shell verwenden.
sean@beerhaus:~$ php -a php > print time(); 1324402770
Wenn Sie eine Array -Darstellung der Unix -Zeit benötigen, verwenden Sie die Funktion getdate()
. Es akzeptiert einen optionalen UNIX -Zeitstempelparameter, jedoch standardmäßig einen Wert von time()
, wenn nicht angegeben.
php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )
Format Unix Time
Unix -Zeit kann leicht zu jeder Zeichenfolge formatiert werden, die Menschen lesen möchten. date()
wird verwendet, um Unix-Zeitstempel in menschlich-lesbare Zeichenfolgen zu formatieren und einen Formatparameter und einen optionalen Zeitparameter zu akzeptieren. Wenn kein optionaler Zeitstempel bereitgestellt wird, wird der Wert von time()
verwendet.
sean@beerhaus:~$ php -a php > print time(); 1324402770
"R" Format String gibt die von RFC 2822 angegebene Formatierungszeit zurück. Natürlich können Sie andere Spezifizierer verwenden, um Ihr eigenes benutzerdefiniertes Format zu definieren.
php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )
Siehe die Seite von date()
in der PHP -Dokumentation für eine vollständige Liste akzeptabler formatierter Zeichen. In Verbindung mit den Funktionen mktime()
und strtotime()
wird die Funktion jedoch nützlicher, wie Sie in den folgenden Beispielen sehen werden.
Erstellen Sie die Unix -Zeit basierend auf einer bestimmten Zeit
mktime()
wird verwendet, um Unix -Zeitstempel basierend auf einer Liste von Werten (Sekunden, Minuten, Stunden, Jahre usw.) zu erstellen, die jedem Teil des Datums entsprechen. Es akzeptiert viele Ganzzahlparameter und setzt jeden Teil des Datums in der folgenden Reihenfolge fest:
php > print date("r", $unixTime); Tue, 20 Dec 2011 12:54:48 -0500
Set isDST
auf 1, wenn die Sparenzeit für Tageslicht auf 0 eingestellt ist.
php > print date("m/d/y h:i:s a", $unixTime); 12/20/11 12:54:48 pm php > print date("m/d/y h:i:s a"); 12/20/11 01:12:11 pm php > print date("jS of F Y", $unixTime); 20th of December 2011
Sie können sehen, dass mktime()
bei der Bearbeitung von Datenbankabfragen mit den benutzerdefinierten Datumsbereichen sehr nützlich ist. Wenn Sie beispielsweise Zeitstempel als Ganzzahlen (UNIX-Zeit) in MySQL (Vorhaben jemanden?) Speichern, ist es einfach, ein gemeinsames Abfragebereich von Jahr zu Jahr festzulegen.
<code>mktime(hour, minute, second, month, day, year, isDST)</code>
Englischdaten auf Unix -Zeit auflösen
Fast magische Funktion strtotime()
nimmt eine Zeichenfolge im Datum/Zeitformat als erstes Argument und einen Unix -Zeitstempel, der als Basis für die Konvertierung verwendet wird. Weitere Informationen zu akzeptablen Datumsformaten finden Sie in der Dokumentation.
php > print date("r", mktime(12, 0, 0, 1, 20, 1987)); Tue, 20 Jan 1987 12:00:00 -0500 php > print date("r", mktime(0, 0, 0, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 00:00:00 -0500 php > print date("r", mktime(23, 59, 59, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 23:59:59 -0500
Phps DateTime- und DateTimeZone -Objekte
Phps DateTime
Objekt ist eine objektorientierte Methode, die Daten und Zeitzonen behandelt. Der Konstruktor akzeptiert eine String -Darstellung der Zeit, die dem oben genannten strtotime()
sehr ähnlich ist, das einige Menschen möglicherweise einfacher zu bedienen finden. Wenn keine Parameter bereitgestellt werden, lautet der Standardwert "jetzt".
<?php $startTime = mktime(0, 0, 0, 1, 1, date("y")); $endTime = mktime(0, 0, 0, date("m"), date("d"), date("y"));
DateTime
-Methode von format()
funktioniert genauso wie die oben date()
-Funktion und akzeptiert alle die gleichen formatierten Zeichen. Das DateTime
-Objekt wird auch mit einigen nützlichen Konstanten ausgestattet, die der Methode format()
zugeführt werden können.
php > print strtotime("now"); 1324407707 php > print date("r", strtotime("now")); Tue, 20 Dec 2011 14:01:51 -0500 php > print strtotime("+1 week"); 1325012569 php > print date("r", strtotime("+1 week")); Tue, 27 Dec 2011 14:03:03 -0500 php > print date("r", strtotime("next month")); Fri, 20 Jan 2012 14:04:20 -0500 php > print date("r", strtotime("next month", mktime(0, 0, 0))); Fri, 20 Jan 2012 00:00:00 -0500 php > print date("r", strtotime("next month", mktime(0, 0, 0, 1, 31))); Thu, 03 Mar 2011 00:00:00 -0500
Die vollständige Liste der Konstanten finden Sie auf der Dokumentseite DateTime
. Da wir uns bald mit der Zeitzone auseinandersetzen werden, geben wir eine Standardzeitzone für PHP an. Suchen Sie in Ihrer Php.ini -Konfigurationsdatei (ich habe eine für CLI und eine für Apache) den Abschnitt wie unten gezeigt:
php > $dt = new DateTime("now"); php > print $dt->format("r"); Tue, 20 Dec 2011 16:28:32 -0500 php > $dt = new DateTime("December 31 1999 12:12:12 EST"); php > print $dt->format("r"); Fri, 31 Dec 1999 12:12:12 -0500
Wenn date.timezone
kein Wert zugeordnet wird, wird PHP sein Bestes geben, um die auf dem Server festgelegte Systemzeitzone zu bestimmen. Sie können date_default_timezone_get()
verwenden, um zu überprüfen, welcher Wert PHP verwendet.
sean@beerhaus:~$ php -a php > print time(); 1324402770
setzen wir die Zeitzone des Servers auf die UTC -Zeit (date.timezone = UTC
) und speichern Sie die Konfigurationsdatei. Sie müssen Apache oder CLI -Shell neu starten, um die Änderungen anzuzeigen. Das Php DateTime
-Objekt enthält eine interne DateTimeZone
-Klassinstanz, um die Zeitzone zu verfolgen. Wenn Sie eine neue Instanz von DateTime
erstellen, sollte der interne DateTimeZone
auf den in php.ini bereitgestellten Standardwert festgelegt werden.
php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )
Die vollständige Liste der akzeptablen Zeitzonennamen finden Sie auf der Zeitzone -Dokumentseite. Sie können jetzt den Zeitunterschied sehen, wenn zwei DateTime
-Objekte unterschiedliche Zeitzonen erhalten. Zum Beispiel ist hier ein Beispiel für die Konvertierung von UTC in Amerika/new_york (EST).
php > print date("r", $unixTime); Tue, 20 Dec 2011 12:54:48 -0500
Bitte beachten Sie den Offset -0500 im Dezember. Wenn Sie den Zeitwert auf ein Sommerdatum wie den 1. Juli ändern, werden Sie feststellen, dass es die Tageslichtsparenzeit (EDT) kennt.
php > print date("m/d/y h:i:s a", $unixTime); 12/20/11 12:54:48 pm php > print date("m/d/y h:i:s a"); 12/20/11 01:12:11 pm php > print date("jS of F Y", $unixTime); 20th of December 2011
Verwenden Sie Daten mit MySQL und Php
Wenn Sie MySQL auf einer beliebigen Ebene verwendet haben, haben Sie möglicherweise den DateTime -Typ festgestellt, der nicht in der Box funktioniert. Es sieht aus und riecht nach einem Date, und wenn Sie sagen, es ist ein Datum, haben Sie Recht. Sobald Sie es jedoch von MySQL in PHP ausgewählt haben, haben Sie nur eine Zeichenfolge, die wie ein Datum aussieht. Es hat kein Zeitzonenbewusstsein und ist für den menschlichen Gebrauch formatiert, bevor der Mensch es anzeigen muss. Ja, ich weiß, dass MySQL viele Date -Formatierungsfunktionen hat, aber wir verwenden bereits PHP, und wie Sie sehen können, ist PHP hervorragend in der Handhabungsdatumformate. Warum müssen wir es auch direkt aus der Datenbank formatieren? Möglicherweise müssen wir verschiedene Conversions und Formate anwenden. Es ist am besten, das Datum nur dann zu formatieren, wenn Menschen es sehen.
<code>mktime(hour, minute, second, month, day, year, isDST)</code>
Führen Sie dieses einfache Skript aus und Sie können sehen, dass alles, was Sie aus dem Feld DateTime erhalten, eine formatierte Zeichenfolge ohne Zeitzoneninformationen ist.
php > print date("r", mktime(12, 0, 0, 1, 20, 1987)); Tue, 20 Jan 1987 12:00:00 -0500 php > print date("r", mktime(0, 0, 0, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 00:00:00 -0500 php > print date("r", mktime(23, 59, 59, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 23:59:59 -0500
DateTime -Wert ist die lokale Zeit des Servers, die MySQL ausführen, unabhängig von der Zeitzone dieses Servers. Wenn Sie nur einen Server in eine Zeitzone einbeziehen, ist DateTime für die meisten Ihrer Bedürfnisse möglicherweise geeignet, und ich bin sehr neidisch auf Sie. Wie benutze ich PHP und MySQL, um mit Daten und Zeitzonen umzugehen? Speichern Sie Daten als Unix -Zeitstempel. Sie wissen bereits, dass die Unix -Zeit die Anzahl der Sekunden seit der UTC am 1. Januar 1970 ist. Dadurch erhalten Sie eine konstante Zeitzone, und Sie haben möglicherweise festgestellt, dass viele Datums-/Zeitfunktionen von PHP auf UNIX -Zeitstempeln basieren. Bei Verwendung von MySQL erstelle ich normalerweise eine Tabellenspalte, in der Daten als ganzzahlige nicht signierte Vorzeichen gespeichert sind. Wenn Sie ein Datum einfügen, können Sie PHPs time()
oder Mysql UNIX_TIMESTAMP()
verwenden.
<?php $startTime = mktime(0, 0, 0, 1, 1, date("y")); $endTime = mktime(0, 0, 0, date("m"), date("d"), date("y"));
Wenn Sie möchten, dass MySQL Daten formatieren, können Sie dies tun. Die Zeit ist jedoch in der Zeitzone des Servers, die MySQL ausführen, und ich empfehle, dass Sie keine Formatierung durchführen, wenn Sie die Vorlage/Ansichtspegel Ihrer Webanwendung erreichen und bereit sind, sie zu sehen.
sean@beerhaus:~$ php -a php > print time(); 1324402770
In jeder Anwendung, die Zeitzonen umfasst, haben Sie normalerweise eine Tabelle, die die benutzerdefinierten Zeitzoneneinstellungen des Benutzers verfolgt und sie dann in den Wert $_SESSION
liest. Angenommen, Sie haben einen Sitzungseintrag, wie unten gezeigt:
php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )
Sie können die gespeicherten Unix -Zeiten (in UTC) einfach in die Zeitzone eines bestimmten Benutzers um konvertieren.
php > print date("r", $unixTime); Tue, 20 Dec 2011 12:54:48 -0500
Dies führt zu dem Datum "Mon, 16. Januar 2012 12:03:49 -0600". -0600 sagt Ihnen, dass es 6 Stunden hinter UTC und der Offset von UTC 0 liegt. Wenn wir die Zeitzone auf Amerika/los_angeles festlegen, lautet das generierte Datum:
php > print date("m/d/y h:i:s a", $unixTime); 12/20/11 12:54:48 pm php > print date("m/d/y h:i:s a"); 12/20/11 01:12:11 pm php > print date("jS of F Y", $unixTime); 20th of December 2011
und America/new_york werden erzeugen:
<code>mktime(hour, minute, second, month, day, year, isDST)</code>
Zusammenfassung
Handhabungsdaten und Zeitzonen sind Teil des täglichen Lebens vieler Programmierer, aber es besteht keine Notwendigkeit, sich Sorgen zu machen, wenn Sie die leistungsstarke und benutzerfreundliche Date-Bibliothek von PHP verwenden können. Sie haben gelernt, wie man Unix -Zeitstempel bekommt, wie man Termine in jedem erdenklichen Format formatiert, wie man die englische Darstellung von Daten in Zeitstempel analysiert, wie man Zeitstempel einhält und wie man zwischen Zeitzonen umwandelt. Wenn es in diesem Artikel zwei Hauptpunkte gibt, ist es 1) die Unix -Zeit und 2) bei der Verwendung von PHP und MySQL als Basiszeitzone als Basiszeitzone festhalten. Die Idee aller Zeiten, die auf UTC basieren, gilt nicht nur für PHP und MySQL. Wenn Sie in einer anderen Sprache arbeiten, besteht eine gute Chance, dass Sie sich selbst sagen werden: "Verdammt, warum können sie nicht das Gleiche wie PHP tun?"
Bilder von Yakobchuk Vasyl / Shutterstock
(Der FAQ -Abschnitt sollte hier zum FAQ -Abschnitt zum Umgang mit Daten und Zeiten in PHP hinzugefügt werden, ähnlich dem FAQ -Abschnitt im Eingabetxt. Ich habe es hier aufgrund von Platzbeschränkungen nicht hinzugefügt.)
Das obige ist der detaillierte Inhalt vonArbeiten mit Daten und Zeiten in PHP und MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!