web-dev-qa-db-fra.com

PHP convertir l'heure UTC en heure locale

Je reçois l'heure UTC de mon serveur comme dans le format suivant, mon exigence est de convertir l'heure UTC en heure locale. Ainsi, les utilisateurs peuvent voir une heure conviviale sur leur navigateur en fonction de leur fuseau horaire. S'il vous plaît aidez-moi à résoudre ce problème. Je vous remercie 

$utc = "2014-05-29T04:54:30.934Z"

J'ai essayé des méthodes mais ne fonctionne pas dans mon cas 

Premier  

$time = strtotime($utc);
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;

Seconde  

$time = strtotime($utc .' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;
9
Dibish

La raison pour laquelle votre code ne fonctionne pas est probablement due au fait que votre serveur est à l'heure UTC. L’heure locale du serveur est donc UTC.

Solution n ° 1

Une solution potentielle consiste à utiliser le côté serveur suivant et à transmettre l’entier Epoch au navigateur:

$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc); //returns an integer Epoch time: 1401339270

Utilisez ensuite JavaScript pour convertir le nombre entier Epoch en heure locale de l'utilisateur (le navigateur connaît le fuseau horaire de l'utilisateur).

Solution n ° 2

Vous pouvez demander au navigateur de vous envoyer le fuseau horaire de l'utilisateur. Ensuite, vous pouvez utiliser ces informations pour calculer la chaîne de date côté serveur plutôt que côté navigateur. Voir plus ici: https://stackoverflow.com/a/5607444/276949

Cela vous donnera le décalage de l'utilisateur (-7 heures). Vous pouvez utiliser ces informations pour définir le fuseau horaire en regardant ici: Convertir le décalage UTC en fuseau horaire ou en date

12
Martin Konecny

Utilisez simplement une DateTimeZone, par exemple

$dt = new DateTime($utc);
$tz = new DateTimeZone('Asia/Kolkata'); // or whatever zone you're after

$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s');

Démo ~ http://ideone.com/fkM4ct

13
Phil

Si cela n'est pas fait via un paramètre de profil utilisateur, il est probablement plus simple et plus simple d'utiliser une bibliothèque de temps javascript, par exemple. moment.js ( http://momentjs.com/ ) pour résoudre ce problème (envoyez toutes les dates/heures au format UTC puis convertissez-les au niveau du client).

Javascript par exemple. (Je suis sûr que cela peut être réalisé sans créer deux objets instantanés (corrigez-le à votre guise).

function utcToLocalTime(utcTimeString){
    var theTime  = moment.utc(utcTimeString).toDate(); // moment date object in local time
    var localTime = moment(theTime).format('YYYY-MM-DD HH:mm'); //format the moment time object to string

    return localTime;
}

exemple php pour la résolution côté serveur (utilisez uniquement l'une de ces solutions, les deux ensemble produiront une heure incorrecte du côté du client)

/**
 * @param $dateTimeUTC
 * @param string $timeZone
 * @param string $dateFormat
 * @return string
 *
 * Epoch to datetime (utc/gmt)::
 * gmdate('Y-m-d H:i:s', $Epoch);
 */
function dateToTimezone($timeZone = 'UTC', $dateTimeUTC = null, $dateFormat = 'Y-m-d H:i:s'){

    $dateTimeUTC = $dateTimeUTC ? $dateTimeUTC : date("Y-m-d H:i:s");

    $date = new DateTime($dateTimeUTC, new DateTimeZone('UTC'));
    $date->setTimeZone(new DateTimeZone($timeZone));

    return $date->format($dateFormat);
}
3
Robin

Il suffit d’envoyer l’heure UTC au navigateur. Utilisez JavaScript pour l’analyser avec un objet Date ou avec moment.js , puis affichez-le sous forme de texte.

En le faisant en JavaScript côté client, vous n'avez pas besoin de connaître le fuseau horaire de l'utilisateur. Le navigateur sera responsable de cela à la place.

2
Matt Johnson
#cnvt_usrTime_to_UTC 0

function cnvt_usrTime_to_UTC($dt_start_time_formate,$UTC_TimeZone){

  $LocalTime_start_time = new DateTime( $dt_start_time_formate );
  $tz_start = new DateTimeZone( $UTC_TimeZone );
  $LocalTime_start_time->setTimezone( $tz_start );
  $array_start_time = (array) $LocalTime_start_time;

  return $UTC_Time_Start_Time = $array_start_time['date'];
}

appelez la fonction cnvt_usrTime_to_UTC ($ dt_start_time_formate, 'UTC');

#cnvt_UTC_to_usrTime
function cnvt_UTC_to_usrTime($Date_Time,$User_time_Zone){

    date_default_timezone_set('UTC');

    $LocalTime_start_time = new DateTime( $Date_Time );
    $tz_start = new DateTimeZone( $User_time_Zone );
    $LocalTime_start_time->setTimezone( $tz_start );
    $start_date_time = (array) $LocalTime_start_time;

    return $StartDateTime = $start_date_time['date'];
}

appeler la fonction 

cnvt_UTC_to_usrTime($value_edit['dt_start_time'],Asia/Kolkata);
2
Divyesh Chothani

Utilisez la fonction date_default_timezone_set avant de passer à l’heure locale, puis configurez à nouveau UTC Europe/Lisbon timezone List of Supported Timezones

  <?php

$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc);
echo "<br/>Defualt UTC/server time".$dateInLocal = date("Y-m-d H:i:s", $time);

//your local time zone put here
date_default_timezone_set('Asia/Kolkata');

echo "<br/>Local time". $dateInLocal = date("Y-m-d H:i:s", $time);
?>
1
Girish

essayez avec date_default_timezone_set () et définissez la date en fonction du fuseau horaire

date_default_timezone_set('asia/kolkata');
$utc = "2014-05-29T04:54:30.934Z";
$time = strtotime($utc);
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal;  //2014-05-29 10:24:30
echo '<br>';
date_default_timezone_set('America/Chicago'); 
$time = strtotime($utc .' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
echo $dateInLocal; //2014-05-28 23:54:30 
0
Rakesh Sharma