Ich speichere die UTC-Daten in der DB mit:
$utc = gmdate("M d Y h:i:s A");
und dann möchte ich das gespeicherte UTC-Datum in die Ortszeit des Clients konvertieren.
Wie kann ich das machen?
Danke
Ich speichere die UTC-Daten in der DB mit:
$utc = gmdate("M d Y h:i:s A");
und dann möchte ich das gespeicherte UTC-Datum in die Ortszeit des Clients konvertieren.
Wie kann ich das machen?
Danke
webjprgm
PHPs strtotime
Die Funktion interpretiert Zeitzonencodes wie UTC. Wenn Sie das Datum von der Datenbank/dem Client ohne den Zeitzonencode erhalten, aber wissen, dass es sich um UTC handelt, können Sie es anhängen.
Angenommen, Sie erhalten das Datum mit Zeitstempelcode (wie “Fr 23. März 2012 22:23:03 GMT-0700 (PDT)”, was der Javascript-Code ist ""+(new Date())
gibt):
$time = strtotime($dateWithTimeZone);
$dateInLocal = date("Y-m-d H:i:s", $time);
Oder wenn Sie dies nicht tun, was wahrscheinlich von MySQL stammt, dann:
$time = strtotime($dateInUTC.' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
Das zweite Code-Snippet ist das, was ich brauchte, um die Ausgabe von sqlite’s zu konvertieren datetime()
Funktion von UTC nach Ortszeit.
– fuenfundachtzig
6. Oktober 14 um 13:10 Uhr
Danke, du hast meine Stunden gespart.
– Abbas
12. Dezember 15 um 10:49 Uhr
Vielen Dank für diese ‘UTC’-Endzeichenfolge.
– Jeaf Gilbert
13. November 18 um 10:48 Uhr
Timo Huovinen
Wenn Sie mit Client den Browser meinen, müssen Sie zuerst den Zeitzonennamen vom Browser an PHP senden und dann die Konvertierung wie unten beschrieben durchführen.
Konvertieren Sie die UTC-Datumszeit in Amerika/Denver
// create a $dt object with the UTC timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));
// change the timezone of the object without changing its time
$dt->setTimezone(new DateTimeZone('America/Denver'));
// format the datetime
$dt->format('Y-m-d H:i:s T');
Dies funktioniert mit Daten nach 2032, Sommerzeit und Schaltsekunden und hängt nicht vom Gebietsschema oder der Zeitzone des Hostcomputers ab.
Es verwendet die Zeitzonendatenbank, um die Berechnung durchzuführen, diese Datenbank ändert sich im Laufe der Zeit, wenn sich die Zeitzonenregeln ändern, und muss auf dem neuesten Stand gehalten werden. (siehe Anmerkungen ganz unten)
Um das UTC-Datum in die (lokale) Serverzeit umzuwandeln, können Sie verwenden DateTime
ohne das zweite Argument, das standardmäßig die Zeitzone des Servers ist.
// create a $dt object with the UTC timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));
// get the local timezone
$loc = (new DateTime)->getTimezone();
// change the timezone of the object without changing its time
$dt->setTimezone($loc);
// format the datetime
$dt->format('Y-m-d H:i:s T');
Ich empfehle die Verwendung DateTimeImmutable
weil es Variablen nicht mutiert (sie nicht hinter den Kulissen ändert), ansonsten funktioniert es genauso DateTime
.
// create a $dt object with the UTC timezone
$dt_utc = new DateTimeImmutable('2016-12-12 12:12:12', new DateTimeZone('UTC'));
// Create a new instance with the new timezone
$dt_denver = $dt_utc->setTimezone(new DateTimeZone('America/Denver'));
// format the datetime
$dt_denver->format('Y-m-d H:i:s T');
Die Unveränderlichkeit ermöglicht es Ihnen, die Verkettung mehrmals zu verwenden, ohne den Wert von zu ändern $dt
$dt = new DateTimeImmutable('2016-12-12 12:12:12', new DateTimeZone('UTC'));
// Format $dt in Denver timezone
echo $dt->setTimezone(new DateTimeZone('America/Denver'))->format('Y-m-d H:i:s T');
// Format $dt in Madrid timezone
echo $dt->setTimezone(new DateTimeZone('Europe/Madrid'))->format('Y-m-d H:i:s T');
// Format $dt in Local server timezone
echo $dt->setTimezone((new DateTime())->getTimezone())->format('Y-m-d H:i:s T');
time()
gibt die zurück Unix-Zeitstempelwas eine Zahl ist, hat sie keine Zeitzone.
date('Y-m-d H:i:s T')
gibt das Datum in der Zeitzone des aktuellen Gebietsschemas zurück.
gmdate('Y-m-d H:i:s T')
gibt das Datum in UTC zurück
date_default_timezone_set()
ändert die aktuelle Gebietsschema-Zeitzone
um eine Zeit in einer Zeitzone zu ändern
// create a $dt object with the America/Denver timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('America/Denver'));
// change the timezone of the object without changing it's time
$dt->setTimezone(new DateTimeZone('UTC'));
// format the datetime
$dt->format('Y-m-d H:i:s T');
Hier sehen Sie alle verfügbaren Zeitzonen
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Hier sind alle Formatierungsoptionen
http://php.net/manual/en/function.date.php
Aktualisieren Sie die PHP-Zeitzonen-DB (in Linux)
sudo pecl install timezonedb
Aufgrund der Sommerzeit wiederholen sich einige Datumsangaben in einigen Zeitzonen, beispielsweise ist in den USA der 13. März 2011, 2:15 Uhr nie aufgetreten, während der 6. November 2011, 1:15 Uhr, zweimal aufgetreten ist. Diese Datetimes können nicht genau bestimmt werden.
Dies beantwortet tatsächlich die Frage, anstatt anzubieten, “wie man die Ortszeit erhält”.
– ChristoKiwi
23. Oktober 17 um 20:54 Uhr
Dies ist die richtige Antwort, da die Änderung der Zeitzone des $dt-Objekts den Sommerzeit-Offset ZUM ZEITPUNKT DES OBJEKTS korrekt mitzählt (und nicht zur aktuellen Ortszeit, wenn der Code ausgeführt wird).
– Bytebereich
07.09.19 um 13:00 Uhr
Das ist genau das, wonach ich gesucht habe. Danke schön.
– HartleySan
3. Januar 20 um 14:26 Uhr
Hier teile ich das Skript, konvertiere den UTC-Zeitstempel in den indischen Zeitstempel: –
// create a $utc object with the UTC timezone
$IST = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));
// change the timezone of the object without changing it's time
$IST->setTimezone(new DateTimeZone('Asia/Kolkata'));
// format the datetime
echo $IST->format('Y-m-d H:i:s T');
Die Datumsarithmetik ist nicht erforderlich, wenn Sie nur denselben Zeitstempel in verschiedenen Zeitzonen anzeigen möchten:
$format = "M d, Y h:ia";
$timestamp = gmdate($format);
date_default_timezone_set("UTC");
$utc_datetime = date($format, $timestamp);
date_default_timezone_set("America/Guayaquil");
$local_datetime = date($format, $timestamp);
date()
und localtime()
beide verwenden die lokale Zeitzone für den Server, sofern sie nicht außer Kraft gesetzt wird; Sie können die verwendete Zeitzone mit überschreiben date_default_timezone_set()
.
http://www.php.net/manual/en/function.date-default-timezone-set.php
Aber wie bekomme ich den aktuellen UTC-Zeitstempel?
– Markieren
25. September 10 um 1:35 Uhr
Warum benötigen Sie den aktuellen UTC-Zeitstempel, um den gespeicherten UTC-Zeitstempel zu konvertieren?
– Bernstein
25. September 10 um 1:35 Uhr
Aber wenn du es tust, time()
gibt immer UTC zurück: us2.php.net/manual/en/function.time.php
– Bernstein
25. September 10 um 1:36 Uhr
date(), localtime() usw. beantworten die Frage nicht, da das Schlüsselwort der Frage “UTC” ist und hier fehlt. Die Frage ist in der Tat sehr einfach: Wie rechnet man eine UTC-Zeit in die Ortszeit um.(Beliebig Zeit, nicht die aktuelle Zeit.) Siehe weiter unten meine Antwort.
– Apostolos
15. Juni 17 um 08:11 Uhr
fijiaaron
Holen Sie sich zuerst das Datum in UTC – das haben Sie bereits getan, also wäre dieser Schritt wirklich nur ein Datenbankaufruf:
$timezone = "UTC";
date_default_timezone_set($timezone);
$utc = gmdate("M d Y h:i:s A");
print "UTC: " . date('r', strtotime($utc)) . "n";
Stellen Sie als Nächstes Ihre lokale Zeitzone in PHP ein:
$timezone = "America/Guayaquil";
date_default_timezone_set($timezone);
Und jetzt erhalten Sie den Offset in Sekunden:
$offset = date('Z', strtotime($utc));
print "offset: $offset n";
Fügen Sie schließlich den Offset zum ganzzahligen Zeitstempel Ihrer ursprünglichen Datumszeit hinzu:
print "LOCAL: " . date('r', strtotime($utc) + $offset) . "n";
Aber wie bekomme ich den aktuellen UTC-Zeitstempel?
– Markieren
25. September 10 um 1:35 Uhr
Warum benötigen Sie den aktuellen UTC-Zeitstempel, um den gespeicherten UTC-Zeitstempel zu konvertieren?
– Bernstein
25. September 10 um 1:35 Uhr
Aber wenn du es tust, time()
gibt immer UTC zurück: us2.php.net/manual/en/function.time.php
– Bernstein
25. September 10 um 1:36 Uhr
date(), localtime() usw. beantworten die Frage nicht, da das Schlüsselwort der Frage “UTC” ist und hier fehlt. Die Frage ist in der Tat sehr einfach: Wie rechnet man eine UTC-Zeit in die Ortszeit um.(Beliebig Zeit, nicht die aktuelle Zeit.) Siehe weiter unten meine Antwort.
– Apostolos
15. Juni 17 um 08:11 Uhr
whund
Ich speichere Daten in der DB im UTC-Format, aber dann zeige ich sie dem Endbenutzer in seiner lokalen Zeitzone
// retrieve
$d = (new DateTime($val . ' UTC'))->format('U');
return date("Y-m-d H:i:s", $d);
Wie unterscheidet sich dies von der oben gegebenen Antwort?
– Martin
21. September 16 um 9:12 Uhr
Wenn Sie Ihre Verwendung der neueren PHP-DateTime-Klasse umschreiben und erweitern wollten, könnte Ihre Antwort tatsächlich eine neue einzigartige Möglichkeit sein, das gewünschte Ergebnis zu erzielen.
– Martin
21. September 16 um 9:13 Uhr
.