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.
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 ()).
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');
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.
Il devrait aimer ceci:
date_default_timezone_set('America/New_York');
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');
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);
}
cela fonctionne parfaitement en 2019:
date('Y-m-d H:i:s',strtotime($date. ' '.$timezone));
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;
}