Conversion de fuseau horaire en php
Quelqu'un peut-il Suggérer une méthode facile pour convertir la date et l'heure en différents fuseaux horaires en php?
8 réponses
Vous pouvez utiliser l'objet datetime ou leurs alias de fonction pour ceci:
Exemple (abrégée du Manuel PHP)
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');
Modifier concernant les commentaires
Mais je ne peux pas utiliser cette méthode car j'ai besoin d'afficher la date dans différents fuseaux horaires en tant que connexion de l'utilisateur à partir de différents endroits
, ce Qui n'est pas un problème. Lorsqu'un utilisateur se connecte, vous déterminez son fuseau horaire et le définissez sur votre objet DateTime comme indiqué. Je suis à l'aide d'un approche similaire dans l'un de mes projets et cela fonctionne comme un charme.
Dans la base de données j'ai besoin d'obtenir les dates dans un seul fuseau horaire, alors seulement il peut être traité correctement
Vous stockez l'heure sous forme d'horodatage ou de datetime dans un fuseau horaire. Lorsque vous interrogez un champ DateTime, vous convertissez l'heure d'un objet DateTime en ce fuseau horaire ou, si votre base de données le prend en charge, vous interrogez le fuseau horaire sélectionné.
Une méthode encore plus simple ressemble à ceci:
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"));
Comme décrit dans le manuel PHP, strtotime() accepte aussi un fuseau horaire, il suffit de l'ajouter à votre datetime.
Je vous recommande de stocker toutes vos datetimes en UTC car de cette façon vous n'aurez pas de problèmes avec l'heure d'été.
Cela a fonctionné pour moi et c'est assez propre aussi!
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);
Aucune de ces réponses n'a fonctionné pour moi(j'ai sauté en essayant du code trop volumineux). Je pense aussi qu'il est bizarre de changer le fuseau horaire par défaut juste pour une seule conversion.
, Voici ma solution:
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");
}
Donc, pour convertir en valeur par défaut du serveur, il vous suffit de passer un fuseau horaire:
changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");
Pour convertir du serveur par défaut à l'utilisateur, vous devez laisser le 2ème paramètre null ou vide:
changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");
Et pour basculer entre des fuseaux horaires sans rapport avec la valeur par défaut, vous fourniriez 2 fuseaux horaires:
changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");
DateTime::setTimezone -- date_timezone_set - Définit le fuseau horaire de l'objet DateTime
Style orienté objet
<?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";
?>
Style procédural
<?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";
?>
Les exemples ci-dessus produiront:
2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
UTC vers local:
<?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');
?>
/ / convertit la date d'une zone à l'autre.. /* $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");
}
<?php
$time='6:02';
$dt = new DateTime($time, new DateTimeZone('America/New_York'));
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL;
$dt->setTimezone(new DateTimeZone('Asia/Kolkata'));
echo $dt->format('H:i') . PHP_EOL;
?>