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
demandé sur BlitZ 2010-03-24 09:08:51

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é.

97
répondu Gordon 2015-07-21 20:01:35

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é.

12
répondu soger 2013-10-23 15:54:19

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);
10
répondu saada 2014-09-05 20:54:23

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");
6
répondu Skeets 2016-12-12 16:58:40

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
4
répondu itsazzad 2014-07-04 12:14:59

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

?>
3
répondu Eduardo Marcolino 2016-09-30 17:29:58

/ / 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");
}
1
répondu user2801665 2016-02-26 05:21:49
<?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
répondu Hara Prasad 2015-10-12 10:22:04