web-dev-qa-db-fra.com

Obtenir la date actuelle, étant donné un fuseau horaire en PHP?

Je souhaite obtenir la date du jour avec un fuseau horaire au format Paul Eggert (America/New_York) en PHP?

67
einstein

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');

Bibliothèques

  • Carbon - Une bibliothèque de dates très populaire.
  • Chronos - Un remplaçant pour Carbon, axé sur l’immutabilité. Voir ci-dessous pourquoi c'est important.
  • jenssegers/date - Une extension de Carbon qui ajoute un support multilingue.

Je suis sûr qu'il existe un certain nombre d'autres bibliothèques disponibles, mais ce sont quelques unes que je connais bien.


Leçon Bonus: Objets Date Immutables

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.

155
DesignerGuy

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

52
Ghost-Man

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.

4
F21

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;
}
4
Vipul Lakhtariya
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>
0
Kyle