web-dev-qa-db-fra.com

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?

45
raki

Vous pouvez utiliser l'objet datetime ou leurs alias de fonction pour cela:

Exemple (abrégé 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 les commentaires

mais je ne peux pas utiliser cette méthode parce que je dois afficher la date dans différents fuseaux horaires, car l'utilisateur se connecte depuis différents emplacements.

Ce n'est pas un problème. Lorsqu'un utilisateur se connecte, vous déterminez son fuseau horaire et vous le définissez sur votre objet DateTime, comme indiqué. J'utilise une approche similaire dans l'un de mes projets et cela fonctionne à merveille.

dans la base de données j'ai besoin d'obtenir les dates dans n'importe quel fuseau horaire, alors seulement il peut être traité correctement 

Vous stockez l'heure sous forme d'horodatage ou de date/heure dans un seul fuseau horaire. Lorsque vous interrogez un champ DateTime, vous convertissez l'heure d'un objet DateTime en un fuseau horaire ou, si votre base de données le prend en charge, interrogez le fuseau horaire sélectionné.

99
Gordon

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 également un fuseau horaire, il vous suffit de l'ajouter à votre date/heure.

Je vous recommande de stocker toutes vos dates en UTC, car vous ne rencontrerez aucun problème avec l'heure d'été.

14
soger

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);
11
saada

Aucune de ces réponses n'a fonctionné pour moi (j'ai omis d'essayer un code trop volumineux). Je pense aussi que c'est bizarre de changer le fuseau horaire par défaut juste pour une conversion unique.

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 le serveur par défaut, il vous suffit de passer un fuseau horaire:

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");

Pour convertir le paramètre par défaut du serveur en utilisateur, vous devez laisser le deuxième paramètre null ou vide:

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");

Et pour basculer entre des fuseaux horaires autres que ceux par défaut, vous devez fournir 2 fuseaux horaires:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");
7
Skeets

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 vont générer:

2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
5
itsazzad

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

?>
3
Eduardo Marcolino

// Convertir la date d'une zone à une 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");
}
1
user2801665
<?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; 
?>
0
Hara Prasad