$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.
Verwenden Sie DateTime (http://php.net/manual/en/class.datetime.php) – Neodan
* "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
Beispiel: date_default_timezone_set ('Europe/Berlin'); –