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 en 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 le réglage du fuseau horaire 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');
Bibliothèques
-
Carbone - Une bibliothèque de rendez-vous très populaire.
-
Chronos - Une solution de remplacement pour Carbon axée sur l'immuabilité. Voir ci-dessous pourquoi c'est important.
-
jenssegers/date - Une extension de Carbon qui ajoute le support multi-langue.
Je suis sûr qu'il existe un certain nombre d'autres bibliothèques disponibles, mais ce sont celles que je connais.
Leçon bonus : les objets de date immuables
Pendant que vous êtes ici, laissez-moi vous épargner un futur mal de tête. Disons que vous voulez calculer 1 semaine à partir d'aujourd'hui et 2 semaines à partir d'aujourd'hui. Vous pourriez écrire un 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. Modifier un traditionnel DateTime
en PHP ne renvoie pas seulement la date mise à jour mais modifie également l'objet original.
C'est là que DateTimeImmutable
vient.
$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 que nous attendions en retour. En utilisant DateTimeImmutable
au lieu de DateTime
nous évitons les mutations d'état accidentelles et les bogues potentiels.
0 votes
Vous devez absolument accepter Réponse de DesignerGuy ou changez le titre de votre question en quelque chose comme "définir le fuseau horaire par défaut"...
1 votes
@Axel Fait, je ne suis plus un développeur PHP, mais j'espère que ça aidera.
0 votes
Bien joué ! C'était la bonne décision, à mon avis...