web-dev-qa-db-fra.com

PHP UTC à l'heure locale

Environnement serveur

Redhat Enterprise Linux
PHP 5.3.5

Problème

Supposons que j'ai une date et une heure UTC telles que 2011-04-27 02:45 et que je souhaite La convertir en heure locale, qui est America/New_York.

Trois questions:

1.) Mon code ci-dessous pourrait résoudre le problème, êtes-vous d'accord? 

<?php

date_default_timezone_set('America/New_York');  // Set timezone.

$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

// Timezone offset in seconds. The offset for timezones west of UTC is always negative,
// and for those east of UTC is always positive.
$offset = date("Z");

$local_ts = $utc_ts + $offset;  // Local Unix timestamp. Add because $offset is negative.

$local_time = date("Y-m-d g:i A", $local_ts);  // Local time as yyyy-mm-dd h:m am/pm.

echo $local_time;  // 2011-04-26 10:45 PM

?>

2.) Mais, la valeur de $ offset est-elle automatiquement ajustée pour l'heure d'été (DST)?
3.) Si non, comment dois-je modifier mon code pour qu'il s'adapte automatiquement à l'heure d'été?

Je vous remercie :-)

17
John

Cela fera ce que vous voulez en utilisant les PHP natif DateTime et DateTimeZone classes:

$utc_date = DateTime::createFromFormat(
                'Y-m-d G:i', 
                '2011-04-27 02:45', 
                new DateTimeZone('UTC')
);

$nyc_date = $utc_date;
$nyc_date->setTimeZone(new DateTimeZone('America/New_York'));

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM

Voir DateTime :: createFromFormat page de manuel pour plus d'informations.

Après quelques expériences entre les fuseaux horaires pour lesquels l’heure DST n’est pas encore utilisée j’ai découvert que cela prendrait en compte l’heure DST. La même conversion en utilisant ma méthode ci-dessus rend le même temps résultant.

33
Treffynnon

Je sais que ceci est un ancien post, mais vous devez ajouter une autre ligne pour obtenir l'heure exacte.

Avant de convertir en heure locale, vous devez définir le fuseau horaire par défaut sur UTC comme ceci (s'il s'agit du fuseau horaire de l'heure que vous indiquez):

function GmtTimeToLocalTime($time) {
    date_default_timezone_set('UTC');
    $new_date = new DateTime($time);
    $new_date->setTimeZone(new DateTimeZone('America/New_York'));
    return $new_date->format("Y-m-d h:i:s");
}
3
lcompare

Je vais améliorer la réponse de Hasin Hayder

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45 UTC");  // UTC Unix timestamp.
echo date('Y-m-d H:i:s a T', $utc_ts);

Il devrait sortir

2011-04-26 10:45:00 pm EDT

La différence consiste à ajouter le fuseau horaire source. strtotime () accepte le fuseau horaire aussi, vous savez! : p

0
Ainz Ooal Gown
date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

Juste après cette exécution, $ utc_ts contient l'heure locale. PHP gère le DST lui-même. 

= H =

0
Hasin Hayder