2017-07-28 3 views
1

Ich habe an einer Anwendung gearbeitet, die mit der Zeit viele Berechnungen durchführen muss.gmdate nicht über Server hinweg konstant?

alles zu halten, ein vermeintlicher zu arbeiten, begann ich mit:

$dateToday = strtotime(gmdate("m/d/y")); 

Wie ich verstanden, soll dies die GMT-Datum zurückzubringen. Also egal in welcher Zeitzone der Server ist, sollte ich die gleiche Zeit bekommen?

Also, wie ich auf localhost entwickelt hat alles reibungslos funktioniert, aber wenn ich auf einen Server in einer anderen Zeitzone wechselte, bekam ich Probleme.

Echo'ing "$ dateToday" auf localhost gibt mir "1501192800", während das gleiche auf dem Server bekomme ich "1501214400". Das ist der gleiche wie der 6h Zeitunterschied zwischen meinem lokalen Rechner und dem Server.

Also was fehlt mir hier?

Dank

+0

Verwenden Sie DateTime (http://php.net/manual/en/class.datetime.php) – Neodan

+1

* "Also, was fehlt mir hier? *" - ein gutes Lesen und Verständnis der Zeitzonen und wie sie sind beeinflussen die Zeiten Berechnungen und auch das Wissen von PHP [Datum/Uhrzeit Funktionen] (http://php.net/manual/en/ref.datetime.php). Ich empfehle Ihnen, über sie zu lesen, aber verwenden Sie sie nicht. Verwenden Sie stattdessen die ['DateTime'] (http://php.net/manual/en/class.datetime.php) und verwandte Klassen. Sie sind einfacher zu verwenden und bieten vollständige Unterstützung für Zeitzonen (während die alten Datums-/Uhrzeitfunktionen dies nicht tun.) – axiac

+0

Beispiel: date_default_timezone_set ('Europe/Berlin'); –

Antwort

2
$dateToday = strtotime(gmdate("m/d/y")); 

Wie ich verstanden, soll dies die GMT-Datum zurückzubringen.

Überhaupt nicht.

gmdate() formatiert ein Datum mit der GMT-Zeitzone. Da Sie es mit nur einem Argument aufgerufen haben, wird das zu formatierende Datum durch Aufruf von time() abgerufen.

time() gibt den aktuellen Zeitstempel zurück, d. H. Die Anzahl der seit Jan 1, 1970, 0:00:00 UTC vergangenen Sekunden.

Dann verwendet gmdate() das Format, das Sie in seinem ersten Argument angeben, um eine Textdarstellung seines zweiten Arguments zu erzeugen (der aktuelle Zeitstempel, wie wir gesehen haben). Der von gmdate("m/d/Y") zurückgegebene Wert ist 07/28/2017.

Dann wird 07/28/2017 an strtotime() übergeben, die versucht, es als ein Datum zu interpretieren und berechnet einen Zeitstempel daraus. Da es keine Zeitkomponente enthält, nimmt strtotime() an, dass die Zeit 0:00:00 ist.

Und hier kommt der Haken. Da die angegebene Zeichenfolge auch keine Zeitzoneninformationen enthält, verwendet PHP seine Konfiguration, um eine Zeitzone anzunehmen. Wie Sie bereits festgestellt haben, kann das Ausführen des Codes auf zwei Servern aufgrund unterschiedlicher Konfigurationen zu unterschiedlichen Ergebnissen führen.

Für mich strtotime(gmdate('m/d/Y')) kehrt 1501200000 und dies ist der Zeitstempel (der Zeitpunkt), wenn heute (July 18, 2017) begann auf der UTC Zeitzone (weil die PHP ich für den Test verwendet wird, verwendet „UTC“ als default timezone). Die Werte, die du auf verschiedenen Servern erhältst, sind die Zeitpunkte, zu denen heute auf ihren jeweiligen Zeitzonen begonnen wurde.

Wenn ich den gleichen Code mit einem PHP, der richtig für meine Zeitzone konfiguriert ist (Europe/Bucharest) bekomme ich 1501189200. Es ist 10800 Sekunden vor dem Wert, den ich mit UTC verwende, weil Europe/Bucharest derzeit auf UTC+3 (der reguläre +2 der osteuropäischen Standardzeit plus 1 Stunde wegen der Sommerzeit ist.

PHP bietet derzeit eine gute Klasse von Klassen zur Behandlung von Datum und Uhrzeit: DateTime und die anderen Klassen, deren Name mit Date beginnt (finden Sie in der Dokumentation). Sie sind einfacher zu benutzen als die alten date & time functions und sie wissen auch, wie man mit den Zeitzonen umgeht (die alten Funktionen wissen nicht).

Erstellen eines DateTime Objekt, das den Beginn der heute in UTC-Zeitzone speichert ist so einfach wie:

$dateToday = new DateTime("today 0:00:00", new DateTimeZone("UTC")); 

Sie können auch ein DateTime Objekt für „jetzt“ schaffen (in der gewünschten Zeitzone) und dann eingestellt seine Zeit, um 0:00:00:

$dateToday = new DateTime("now", new DateTimeZone("UTC")); 
$dateToday->setTime(0, 0, 0); 

Für die DateTime Objekte, die in dem Code nicht geändert werden (sie sind nur lesen) dann besser DateTimeImmutable Objekte erstellen. Diese Klasse verhindert eine versehentliche Änderung der gespeicherten Werte.

+0

Vielen Dank, ich habe $ dateToday = new DateTime ("heute 0:00:00", neue DateTimeZone ("UTC")); $ dateGMTUnixToday = $ DatumHeute-> Format ('U'); und jetzt erhalten Sie eine Konstante 1501200000! Wirklich schätzen Sie die ausführliche Erklärung. – VoidZA

+0

@VoidZA Wenn Sie die Antwort zu schätzen wissen, dann upvote es. Wenn es wirklich geholfen hat dann akzeptiere es – RiggsFolly

+0

Ich habe nicht genug Rep zu upvote, sehe auch keinen "accept" Knopf. – VoidZA

Verwandte Themen