94 votes

Obtenir la date du jour, avec un fuseau horaire en PHP ?

Je veux obtenir la date du jour en fonction d'un fuseau horaire au format Paul Eggert. America/New_York ) en PHP ?

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

223voto

DesignerGuy Points 616

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.

57voto

jabahar Points 853

Définissez d'abord le fuseau horaire par défaut et obtenez la date ensuite, la date sera dans le fuseau horaire que vous avez 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

11 votes

Notez que l'utilisation de date_default_timezone_set() le définit pour toute utilisation de date() après ce point. Voir ma réponse pour un exemple de gestion de plusieurs fuseaux horaires.

9 votes

Actuellement, c'est une mauvaise pratique si vous voulez seulement obtenir une date dans ce fuseau horaire, voir la réponse de DesignerGuy ci-dessous pour une solution plus étoffée.

0 votes

Ce serait bien d'avoir un moyen général de sélectionner le fuseau horaire.

5voto

Vipul Lakhtariya Points 416

J'ai créé une fonction simple que vous pouvez utiliser pour convertir l'heure dans n'importe quel 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;
}

4voto

F21 Points 7685

Si vous avez accès à PHP 5.3, l'option extension intl est très utile pour faire ce genre de choses.

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 le 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 Il s'agit d'une solution bien meilleure que l'utilisation d'un décalage GMT ou UTC, car elle tient également compte des périodes d'économie d'énergie.

Enfin, l'extension intl utilise les données ICU, qui contiennent un grand nombre de fonctionnalités très utiles lorsqu'il s'agit de créer vos propres formats de date/heure.

1voto

Kyle Points 1301
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X