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 :-)
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.
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");
}
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
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 =