web-dev-qa-db-fra.com

Convertir les dates UTC en heure locale en PHP

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

25
Mark

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

http://us3.php.net/manual/en/function.date.php

http://php.net/manual/en/function.localtime.php

10
Amber

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);
57
webjprgm

Réponse

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');

Remarques

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
43
Timo Huovinen

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);
8
fijiaaron

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";
6
fijiaaron

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);
4
Apostolos

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);
4
wdog

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');
1
Henry
$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);
}
0
Senthur Pandi S