8
votes

Stockage des dates et des heures dans UTC et de la convertir l'heure locale dans PHP / MySQL

Je voulais demander si cela allait travailler, avant de partir à un refacteur complet de la façon dont je manipule les dates et les temps.

Pour encadrer ma question, voici mon problème ... Je stocke des "actions" prises par l'utilisateur dans une table d'histoire. Ces actions ont un horodatage sur eux. Les utilisateurs peuvent être du monde entier, et donc des horaires différents. Je veux afficher les articles de l'histoire et montrer les horodatages dans son fuseau horaire local.

En outre, je sais que je peux utiliser des champs DateTime et stocker simplement les formats de temps UTC, mais je choisis d'utiliser l'horodatage afin que je puisse définir une valeur par défaut à l'heure actuelle.

cela fonctionnera-t-il pour mon problème?

  1. Mon fuseau horaire du serveur sera Los Angeles

  2. Stockez les horodatages comme horodatage dans MySQL. Je crois comprendre que l'horodatage est toujours stocké comme UTC. Les enregistrements seront stockés par défaut comme création_date ou je définirai explicitement utc_timetamp (). Efficacement, tous les enregistrements de la DB seront UTC.

  3. Lorsqu'un utilisateur se connecte, je saisira leur fuseau horaire (je le stocke dans la DB comme paramètre utilisateur). Pour cet exemple, disons que cette personne est à New York.

    Voici où ma question est. Sera l'une de ces travaux?

    1. a) saisissez les données d'historique. Tous les horodatages seront automatiquement convertis de UTC à Los Angeles Time. Article de l'histoire, convertissez l'horodatage de Los Angeles à New York Timeestamp et Echo.

      ou

      1. B) Définissez le fuseau horaire PHP "date_default_timezone_set" à New York. Saisir les données d'historique. Tous les horodatages sont toujours à Los Angeles Time par Server est toujours le temps de Los Angeles. Poste de l'histoire, juste écho l'horodatage parce que le "date_default_timezone_set" convertira automatiquement l'horodatage de Los Angeles à New York.

        option 4b fonctionnera? Y a-t-il une meilleure façon de convertir du temps de Los Angeles au temps de New York?

        Y a-t-il un meilleur moyen de le faire en général?


1 commentaires

Stocker dans UTC, l'affichage local à l'utilisateur est la solution dominante.


4 Réponses :


5
votes

Vous êtes correct, les horodatages Unix sont toujours en UCC. Si vous stockez les horodatages de votre base de données dans votre base de données UTC, tout ce que vous devez faire pour la sortir à l'heure locale est de modifier le fuseau horaire dans PHP vers le fuseau horaire local à l'utilisateur. Vous n'avez pas besoin de faire une conversion sur les horodatages.

<?php

$timeStampFromDatabase = 1325448000;  // 01 Jan 2012 20:00:00 GMT

date_default_timezone_set('America/Los_Angeles');
echo date('r', $timeStampFromDatabase); // Sun, 01 Jan 2012 12:00:00 -0800

date_default_timezone_set('Asia/Hong_Kong');
echo date('r', $timeStampFromDatabase); // Mon, 02 Jan 2012 04:00:00 +0800


4 commentaires

date_default_timezone_set est utilisé pour définir le fuseau horaire par défaut. Je ne le laisserais pas plus d'une fois. Je pense qu'il est préférable de créer un objet datetime objet et d'utiliser DateTime :: SettiMezone () : php.net/manual/fr/funcunction.date-timezone-set.php


Eh bien, je ne changeais que pour illustrer le point. Je pense que cela ne sera défini qu'une fois dans l'application, mais vous pouvez le changer plusieurs fois. Si vous faites attention à le changer, vous pouvez toujours le changer, puis le changer à la valeur précédente, sans aucun problème.


Merci une tonne pour l'aide. Question légèrement Newb concernant la fonction date_default_timezone_set. S'agit-il d'un paramètre qui n'effectue que l'utilisateur actuel ou est-ce une variable système globale? Si c'est un Var global, ne pouvait-il pas causer de problèmes parmi tous les utilisateurs de différents fuseaux horaires?


Réglage du fuseau horaire dans un script PHP avec date_default_timezone_set n'affecte que le processus PHP qu'il a été appelé. Cela n'affecte pas les invocations ultérieures de PHP ou d'autres utilisateurs, seul l'utilisateur pour lequel le script exécute actuellement. Et il est réinitialisé lorsque le script se termine. Par défaut PHP définit toujours le fuseau horaire à celui spécifié dans php.ini à partir de la directive date.timezone .



3
votes

Malheureusement, "date_default_timezone_set" ne fonctionnait pas comme je pensais que ce serait. Selon l'exemple précédent, cela fonctionnerait si les dates que j'avais travaillé étaient déjà au format TimeStamp UNIX. Cependant, ils ont été formatés dans "YMD H: I: S" et la seule chose qui changerait était le décalage GMT, qui ne fonctionnait évidemment pas.

Après quelques heures de fidélité, voici comment j'ai pu gérer les conversions horaires . xxx

Je suppose que j'aurais pu faire ce qui suit aussi: xxx

ce qui précède, je pense que je pense que Forcer la fonction de date à gérer sa logique dans l'user_timezone donné. Dans le recul, je devrais traduire chaque DateTime $ -> UNIX_TMESTAMM -> $ DATETime_converted, ce qui ne semble pas être beaucoup mieux que ce que j'ai choisi de faire.


0 commentaires

1
votes

stocke toujours votre horodatage dans la base de données comme UTC. Il s'agit d'un fusil de fuseau horaire et d'avancement de la lumière du temps. Pour afficher ce retour à l'utilisateur dans leur fuseau horaire, faites simplement:

$users_timezone = 'Europe/London'; // See PHP documentation for names that can be used.
$date = new DateTime();
$date->setTimestamp($timestamp_from_database);
$date->setTimezone(new DateTimeZone($users_timezone));   
echo $date->format("H:ia jS F Y");


0 commentaires

0
votes

Par défaut, les horodatages Unix sont toujours en UTC. Si nous stockions les horodatages de notre base de données dans notre base de données, nous devons simplement utiliser le script PHP suivant:

<?php

$TZ_UTC = new DateTimeZone('UTC'); //-->Database Timezone;
$TZ_LOCAL = new DateTimeZone('America/New_York'); //-->Expected Local Timezone from user settings;

//--Example Database Query--
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    //---If we want to show UTC timezone directy----
    echo $row['action_timestamp'];

    //---If we want to show LOCAL timezone from user settings----
    $dateObj = new DateTime($row['action_timestamp'], $TZ_UTC);
    $dateObj->setTimezone($TZ_LOCAL); //--> Here is the conversion!
    echo $dateObj->format("Y-m-d H:i:s T");
}
?>


0 commentaires