Je stocke les dates UTC dans la base de données en utilisant:
$utc = gmdate("M d Y h:i:s A");
je souhaite ensuite convertir la date UTC enregistrée en heure locale du client.
Comment puis je faire ça?
Merci
date()
et localtime()
utilisent tous les deux le fuseau horaire local du serveur, sauf substitution; vous pouvez remplacer le fuseau horaire utilisé avec date_default_timezone_set()
.
http://www.php.net/manual/en/function.date-default-timezone-set.php
La fonction strtotime
de PHP interprétera les codes de fuseau horaire, comme UTC. Si vous obtenez la date de la base de données/du client sans le code du fuseau horaire, mais connaissez le format UTC, vous pouvez l'ajouter.
En supposant que vous obteniez la date avec le code d’horodatage (comme "ven. 23 mars 2012 22:23:03 GMT-0700 (PDT)", c’est ce que le code Javascript ""+(new Date())
donne):
$time = strtotime($dateWithTimeZone);
$dateInLocal = date("Y-m-d H:i:s", $time);
Ou si vous ne le faites pas, ce qui provient probablement de MySQL, alors:
$time = strtotime($dateInUTC.' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
Convertir la date/heure UTC en Amérique/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 it's time
$dt->setTimezone(new DateTimeZone('America/Denver'));
// format the datetime
$dt->format('Y-m-d H:i:s T');
time()
renvoie le timestamp unix , qui est un nombre, il n'a pas de fuseau horaire.
date('Y-m-d H:i:s T')
renvoie la date dans le fuseau horaire régional actuel.
gmdate('Y-m-d H:i:s T')
renvoie la date en UTC
date_default_timezone_set()
modifie le fuseau horaire actuel
changer une heure dans un fuseau horaire
// 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');
ici vous pouvez voir tous les fuseaux horaires disponibles
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
voici toutes les options de formatage
http://php.net/manual/en/function.date.php
Mettre à jour la base de données PHP du fuseau horaire (sous Linux)
Sudo pecl install timezonedb
L'arithmétique des dates n'est pas nécessaire si vous souhaitez simplement afficher le même horodatage dans des fuseaux horaires différents:
$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);
D'abord, obtenez la date en UTC - vous l'avez déjà fait, cette étape serait donc simplement un appel de base de données:
$timezone = "UTC";
date_default_timezone_set($timezone);
$utc = gmdate("M d Y h:i:s A");
print "UTC: " . date('r', strtotime($utc)) . "\n";
Ensuite, définissez votre fuseau horaire local en PHP:
$timezone = "America/Guayaquil";
date_default_timezone_set($timezone);
Et maintenant, obtenez le décalage en quelques secondes:
$offset = date('Z', strtotime($utc));
print "offset: $offset \n";
Enfin, ajoutez le décalage à l'horodatage entier de votre date-heure d'origine:
print "LOCAL: " . date('r', strtotime($utc) + $offset) . "\n";
Voici un moyen simple de convertir l'heure UTC de l'interrogateur en heure locale. C'est pour une heure stockée dans une base de données, etc., c'est-à-dire any time. Il vous suffit de trouver la différence de temps entre l'heure UTC et l'heure locale qui vous intéressent, puis d'ajuster l'heure UTC mémorisée en y ajoutant la différence.
$df = "G:i:s"; // Use a simple time format to find the difference
$ts1 = strtotime(date($df)); // Timestamp of current local time
$ts2 = strtotime(gmdate($df)); // Timestamp of current UTC time
$ts3 = $ts1-$ts2; // Their difference
Vous pouvez ensuite ajouter cette différence à l'heure UTC mémorisée ..__ (à ma place, Athènes, la différence est exactement de 5:00:00)
Exemple:
$time = time() // Or any other timestamp
$time += $ts3 // Add the difference
$dateInLocal = date("Y-m-d H:i:s", $time);
Je stocke la date dans la base de données au format UTC, mais je la montre ensuite à l'utilisateur final dans son fuseau horaire local
// retrieve
$d = (new \DateTime($val . ' UTC'))->format('U');
return date("Y-m-d H:i:s", $d);
Ici, je partage le script, convertit l'horodatage UTC en horodatage indien: -
// 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');
Avec un fuseau horaire local, tel que 'America/Denver', vous pouvez utiliser la classe DateTime pour convertir l'horodatage UTC en date locale:
$timestamp = *********;
$date = new DateTime("@" . $timestamp);
$date->setTimezone(new DateTimeZone('America/Denver'));
echo $date->format('Y-m-d H:i:s');
$UTC_Time = "2018-07-06 06:06:16";
echo "UTC Time ".$UTC_Time;
$Indian_Time = TimeConverion($UTC_Time);
echo "<br> Indian_Time ".$Indian_Time;
function TimeConverion($UTC_Time) {
date_default_timezone_set('Europe/London');
$sTime = date("Y-m-d h:i:sa");
$ts3 = strtotime(date("G:i:s"))-strtotime($sTime);
$utc = explode(" ",$UTC_Time);
$time = strtotime($utc[1]);
date_default_timezone_set("Asia/Calcutta");
$time += $ts3; // Add the difference
return $utc[0]." ".date("H:i:s", $time);
}