Kann jemand eine einfache Methode zum Konvertieren von Datum und Uhrzeit in verschiedene Zeitzonen in PHP vorschlagen?
Zeitzonenumrechnung in php
Raki
Gordon
Sie können dafür das datetime-Objekt oder deren Funktionsaliase verwenden:
Beispiel (Aus dem PHP-Handbuch gekürzt)
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->format('Y-m-d H:i:s') . "\n";
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->format('Y-m-d H:i:s');
Bearbeiten Sie in Bezug auf Kommentare
aber ich kann diese Methode nicht verwenden, da ich das Datum in verschiedenen Zeitzonen anzeigen muss, wenn sich der Benutzer von verschiedenen Standorten aus anmeldet
Das ist kein Problem. Wenn sich ein Benutzer anmeldet, bestimmen Sie seine Zeitzone und setzen sie wie gezeigt auf Ihr DateTime-Objekt. Ich verwende einen ähnlichen Ansatz in einem meiner Projekte und es funktioniert wie ein Zauber.
In der Datenbank muss ich die Daten in einer einzelnen Zeitzone abrufen, nur dann kann sie richtig verarbeitet werden
Sie speichern die Zeit entweder als Zeitstempel oder als Datumszeit in einer Zeitzone. Wenn Sie ein DateTime-Feld abfragen, konvertieren Sie entweder die Zeit in einem DateTime-Objekt in diese Zeitzone oder – wenn Ihre Datenbank dies unterstützt – fragen Sie mit der ausgewählten Zeitzone ab.
-
danke Gordon, aber ich kann diese Methode nicht verwenden, da ich das Datum in verschiedenen Zeitzonen anzeigen muss, wenn sich der Benutzer von verschiedenen Standorten aus anmeldet
– Raki
24. März 2010 um 6:25 Uhr
-
@raki: also gleich nachdem der Benutzer angemeldet ist – richten Sie date_default_timezone_set() mit der vom Benutzer ausgewählten Zeitzone ein.
– zerkms
24. März 2010 um 6:44 Uhr
-
das ist auch nicht möglich.. weil.. in der datenbank muss ich die daten in jeder einzelnen zeitzone bekommen, nur dann kann es richtig verarbeitet werden
– Raki
24. März 2010 um 6:51 Uhr
-
In der Datenbank speicherst du alles in GMT. Entweder das, oder es wird zu einem unüberschaubaren Chaos.
– Jaco
24. März 2010 um 10:08 Uhr
-
all dies ist komplizierter als es sein muss. Wenn ich die Standardzeitzone einstelle, dann wird das Bit date(‘Ymd H:i:s’), das ich tue, um die erstellten/aktualisierten Zeiten zu erhalten, in der Zeitzone des Benutzers sein. Also muss ich sie in UTC umwandeln. Viele Änderungen überall, um sicherzustellen, dass ich die Konvertierung nicht zweimal mache. Das ist wirklich eine Impedanzfehlanpassung.
– Kinjal Dixit
24. November 2012 um 6:22 Uhr
Eine noch einfachere Methode sieht so aus:
date_default_timezone_set('Europe/London'); // your user's timezone
$my_datetime="2013-10-23 15:47:10";
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC"));
Wie beschrieben im PHP-Handbuchstrtotime() akzeptiert auch eine Zeitzone, Sie müssen sie nur an Ihre Datetime anhängen.
Ich empfehle Ihnen, alle Datumsangaben in UTC zu speichern, da Sie auf diese Weise keine Probleme mit der Sommerzeit haben.
Saada
Das hat bei mir funktioniert und es ist auch ziemlich sauber!
function convert_to_user_date($date, $format="n/j/Y g:i A", $userTimeZone="America/Los_Angeles", $serverTimeZone="UTC")
{
try {
$dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone));
$dateTime->setTimezone(new DateTimeZone($userTimeZone));
return $dateTime->format($format);
} catch (Exception $e) {
return '';
}
}
function convert_to_server_date($date, $format="n/j/Y g:i A", $userTimeZone="America/Los_Angeles", $serverTimeZone="UTC")
{
try {
$dateTime = new DateTime ($date, new DateTimeZone($userTimeZone));
$dateTime->setTimezone(new DateTimeZone($serverTimeZone));
return $dateTime->format($format);
} catch (Exception $e) {
return '';
}
}
//example usage
$serverDate = $userDate="2014-09-04 22:37:22";
echo convert_to_user_date($serverDate);
echo convert_to_server_date($userDate);
Skeets
Keine dieser Antworten hat bei mir funktioniert (ich habe das Ausprobieren von Code übersprungen, der übermäßig sperrig war). Ich finde es auch seltsam, die Standardzeitzone nur für eine einzelne Konvertierung zu ändern.
Hier ist meine Lösung:
function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null)
{
if (empty($timeZoneSource)) {
$timeZoneSource = date_default_timezone_get();
}
if (empty($timeZoneTarget)) {
$timeZoneTarget = date_default_timezone_get();
}
$dt = new DateTime($dateString, new DateTimeZone($timeZoneSource));
$dt->setTimezone(new DateTimeZone($timeZoneTarget));
return $dt->format("Y-m-d H:i:s");
}
Um also in den Serverstandard zu konvertieren, würden Sie nur eine Zeitzone übergeben:
changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");
Um vom Serverstandard zum Benutzer zu konvertieren, würden Sie den 2. Parameter null oder leer lassen:
changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");
Und um zwischen 2 Zeitzonen zu wechseln, die nichts mit der Standardeinstellung zu tun haben, würden Sie 2 Zeitzonen angeben:
changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");
Eduard Marcolino
UTC zu lokal:
<?php
$datetime = date("Y-m-d H:i:s");
$utc = new DateTime($datetime, new DateTimeZone('UTC'));
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo'));
echo $utc->format('Y-m-d H:i:s');
?>
esazzad
DateTime::setTimezone — date_timezone_set — Legt die Zeitzone für das DateTime-Objekt fest
Objektorientierter Stil
<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
Verfahrensstil
<?php
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
date_timezone_set($date, timezone_open('Pacific/Chatham'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
?>
Die obigen Beispiele werden ausgegeben:
2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
Brian Tompsett – 汤莱恩
// Convert date from one zone to another..
/*
$zone_from='Asia/Kolkata';
$zone_to='America/Phoenix';
date_default_timezone_set($zone_from);
$convert_date="2016-02-26 10:35:00";
echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to);
*/
function zone_conversion_date($time, $cur_zone, $req_zone)
{
date_default_timezone_set("GMT");
$gmt = date("Y-m-d H:i:s");
date_default_timezone_set($cur_zone);
$local = date("Y-m-d H:i:s");
date_default_timezone_set($req_zone);
$required = date("Y-m-d H:i:s");
/* return $required; */
$diff1 = (strtotime($gmt) - strtotime($local));
$diff2 = (strtotime($required) - strtotime($gmt));
$date = new DateTime($time);
$date->modify("+$diff1 seconds");
$date->modify("+$diff2 seconds");
return $timestamp = $date->format("Y-m-d H:i:s");
}