Je souhaite obtenir la date du jour avec un fuseau horaire au format Paul Eggert (America/New_York
) en PHP?
Les autres réponses définissent le fuseau horaire pour toutes les dates de votre système. Cela ne fonctionne pas toujours bien si vous souhaitez prendre en charge plusieurs fuseaux horaires pour vos utilisateurs.
Voici la version courte:
<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');
Fonctionne dans PHP> = 5.2.0
Liste des fuseaux horaires pris en charge: php.net/manual/fr/timezones.php
Voici une version avec une heure existante et un fuseau horaire défini par un paramètre utilisateur
<?php
$usersTimezone = 'America/New_York';
$date = new DateTime( 'Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone) );
echo $date->format('Y-m-d H:i:s');
Voici une version plus verbeuse pour montrer le processus un peu plus clairement
<?php
// Date for a specific date/time:
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');
// Output date (as-is)
echo $date->format('l, F j Y g:i:s A');
// Output line break (for testing)
echo "\n<br />\n";
// Example user timezone (to show it can be used dynamically)
$usersTimezone = 'America/New_York';
// Convert timezone
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);
// Output date after
echo $date->format('l, F j Y g:i:s A');
Je suis sûr qu'il existe un certain nombre d'autres bibliothèques disponibles, mais ce sont quelques unes que je connais bien.
Pendant que vous êtes ici, laissez-moi vous épargner de futurs maux de tête. Supposons que vous souhaitiez calculer 1 semaine à partir d'aujourd'hui et 2 semaines à partir d'aujourd'hui. Vous pourriez écrire du code comme:
<?php
// Create a datetime (now, in this case 2017-Feb-11)
$today = new DateTime();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
echo "\n<br>";
Le résultat:
2017-02-11
---
2017-03-04
2017-03-04
2017-03-04
Hmmmm ... Ce n'est pas tout à fait ce que nous voulions. La modification d'un objet DateTime
traditionnel dans PHP ne renvoie pas seulement la date de mise à jour, mais modifie également l'objet d'origine.
C'est ici que DateTimeImmutable
entre en jeu.
$today = new DateTimeImmutable();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
Le résultat:
2017-02-11
---
2017-02-11
2017-02-18
2017-02-25
Dans ce deuxième exemple, nous obtenons les dates auxquelles nous nous attendions. En utilisant DateTimeImmutable
au lieu de DateTime
, nous empêchons les mutations d'état accidentelles et les bugs potentiels.
Définissez le fuseau horaire par défaut en premier et obtenez la date. La date sera dans le fuseau horaire spécifié:
<?php
date_default_timezone_set('America/New_York');
$date= date('m-d-Y') ;
?>
http://php.net/manual/en/function.date-default-timezone-set.php
Si vous avez accès à PHP 5.3, l’extension intl) est très pratique pour faire des choses comme celle-ci.
Voici un exemple tiré du manuel:
$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN );
$fmt->format(0); //0 for current time/date
Dans votre cas, vous pouvez faire:
$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/New_York');
$fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since Epoch, UTC) or an array in the format output by localtime().
Comme vous pouvez définir un fuseau horaire tel que America/New_York
, c’est bien mieux que d’utiliser un décalage GMT ou UTC, car cela prend également en compte les périodes d’éclairage diurne.
Enfin, l’extension intl utilise ICU data, qui contient de nombreuses fonctionnalités très utiles pour créer vos propres formats de date et d’heure.
J'ai créé une fonction simple que vous pouvez utiliser pour convertir l'heure en un fuseau horaire:
function convertTimeToLocal($datetime,$timezone='Europe/Dublin') {
$given = new DateTime($datetime, new DateTimeZone("UTC"));
$given->setTimezone(new DateTimeZone($timezone));
$output = $given->format("Y-m-d"); //can change as per your requirement
return $output;
}
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>