web-dev-qa-db-fra.com

PHP date (); avec le fuseau horaire?

J'ai donc vérifié la liste des fuseaux horaires pris en charge en PHP et je me demandais comment les inclure dans la date (); une fonction? Merci!

Je ne veux pas d'un fuseau horaire par défaut, chaque utilisateur a son fuseau horaire stocké dans la base de données, je prends ce fuseau horaire de l'utilisateur et l'utilise. Comment? Je sais comment le prendre à partir de la base de données, pas comment l'utiliser, cependant.

59
user2917204

Pour une telle tâche, vous devriez vraiment utiliser la classe DateTime de PHP. Veuillez ignorer toutes les réponses vous conseillant d'utiliser date () ou date_set_time_zone, c'est tout simplement mauvais et obsolète.

Je vais utiliser un pseudo-code pour illustrer, essayez donc d'ajuster le code selon vos besoins.

En supposant que la variable $ tz contienne le nom de chaîne d'un fuseau horaire valide et que la variable $ timestamp contienne l'horodatage que vous souhaitez formater en fonction du fuseau horaire, le code ressemblerait à ceci:

$tz = 'Europe/London';
$timestamp = time();
$dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string
$dt->setTimestamp($timestamp); //adjust the object to correct timestamp
echo $dt->format('d.m.Y, H:i:s');

La classe DateTime est puissante et pour saisir toutes ses capacités, vous devriez consacrer une partie de votre temps à le lire sur php.net. Pour répondre pleinement à votre question - oui, vous pouvez ajuster le paramètre de fuseau horaire de manière dynamique (à chaque itération lors de la lecture de la base de données, vous pouvez créer un nouvel objet DateTimeZone ()).

107
N.B.

Si j'ai bien compris, vous devez d'abord définir le fuseau horaire comme suit:

date_default_timezone_set('UTC');

Et que vous pouvez utiliser la fonction de date:

// Prints something like: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
28
Suresh Kamrushi

Utilisez plutôt la classe DateTime , car elle prend en charge les fuseaux horaires. L'équivalent DateTime de date() est DateTime::format .

Un wrapper extrêmement utile pour DateTime est Carbon - jetez-y un coup d'oeil.

Vous voudrez stocker dans la base de données au format UTC et convertir au niveau de l'application.

15
ceejayoz

Il devrait aimer ceci:

date_default_timezone_set('America/New_York');
8
user3049608

Le réponse ci-dessus m'a fait sauter à travers quelques cerceaux/pièges, il suffit donc de poster le code du nettoyeur qui a fonctionné pour moi:

$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('America/New_York'));
$dt->setTimestamp(123456789);

echo $dt->format('F j, Y @ G:i');
7
Andrew

Essaye ça. Vous pouvez passer soit un timestamp unix, soit une chaîne datetime

public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Y-m-d H:i:s') 
    {
        $datetime = is_numeric($timestamp) ?
                    DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) :
                    new DateTime($timestamp, new DateTimeZone($fromTimezone));

        $datetime->setTimezone(new DateTimeZone($toTimezone));

        return $datetime->format($format);
    }
2
dzona

cela fonctionne parfaitement en 2019:

date('Y-m-d H:i:s',strtotime($date. ' '.$timezone)); 
0
emmanuel

J'ai créé cette fonction très simple, et cela fonctionne comme un charme:

function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */            
        $date = new DateTime(date("d F Y H:i:s",$timestamp));
        $date->setTimezone(new DateTimeZone($timezone));
        $rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */
        return $rt;
    }
0
Shatadip