0
votes

Magasinez dans UTC dans SQLite et affichez-le dans le fuseau horaire local avec PHP

J'ai une table contenant une colonne DateTime: xxx pré>

et j'ajoute une ligne (stocker la date de l'ajout de l'ajout de la ligne en UTC) avec P>

$results = $db->query('SELECT * FROM test ORDER BY date desc');
while ($row = $results->fetchArray()) {
    echo $row['date'];
}


2 commentaires

Toutes les options semblent légitimes. Vous pouvez voir comment faire la 2ème option ici: Stackoverflow.com/questions/15017799/... . Je suppose qu'il n'y a pas beaucoup de différence entre les options et c'est plus sur ce qui est plus pratique pour vous.


Lire soigneusement sqlite.org/lang_datefunc.html et vous verrez comment faire la deuxième option .


3 Réponses :


0
votes

Comme suggéré par un commentaire, Cette page mentionne le localTime code > modificateur. Voici une solution:

$results = $db->query('SELECT datetime(date, "localtime") AS localdate, foo FROM test ORDER BY date desc');
while ($row = $results->fetchArray()) {
    echo $row['localdate'];
}


0 commentaires

0
votes

Je dirais ce que vous devez faire est de stocker vos valeurs de temps comme quelque chose appelé «horodatage UNIX», qui est littéralement le nombre de secondes depuis l'UTC 1er janvier 1970 00:00. Vous pouvez obtenir l'heure actuelle en utilisant la fonction de PHP () . Puis changez votre colonne de db "date" à un type d'entier. De cette manière, les données de temps stockées dans votre base de données sont totalement indépendantes du fuseau horaire, etc., qui est une bonne chose!

Pour interpréter ces fuseaux horaires correctement, nous pouvons utiliser PHP DateTime Object, qui fera tout le levage lourd en termes de délaizones et dst. L'extrait de code suivant donne les idées de base: xxx

si le client est dans DST devrait obtenir de JS, Regardez la réponse à cette question pour une méthode simple , mais de nombreuses bibliothèques, etc. peuvent également le faire.

La grande question, pourquoi aller très loin?

  • Les données temporelles de votre base de données sont totalement indépendantes de la configuration de DB / serveur. Au fil du temps, cela peut errer et les insectes peuvent entrer en jeu; Vous voulez que vos données fondamentales soient cohérentes.
  • Cela permet à PHP faire tout le travail acharné concernant l'adaptation des fuseaux horaires et DST, à travers toutes les régions / régime DST. Cela devient un gros mal de tête si vous essayez de résoudre ce problème, DST est très gênant.
  • Time Maths est beaucoup plus efficace et plus facile, en particulier dans les appels de dB. Tout ce que vous avez à faire est des comparaisons numériques de secondes, plutôt que de traiter des fonctions SQL, etc.
  • pas de dépendance à des fonctions ou de moteurs de DB spécifiques; c'est juste une valeur entière! Fait pour une portabilité beaucoup plus facile.

    Un mot de prudence, faites attention à la valeur maximale de votre colonne integer DB. Trouver les valeurs max / min, convertissez-les en heures de date ( Ceci est un outil utile ) et vérifiez votre utilisation. Cas.

    La dernière chose à dire, vous pouvez utiliser l'objet DateTime pour interpréter les chaînes de temps (comme vous l'utilisez maintenant) dans UTC, puis définissez le fuseau horaire avant d'imprimer. Cela fonctionnera, mais je pense que cela est beaucoup plus sujet à une erreur.

    J'espère que cela aide :)


0 commentaires

0
votes

Regardez cette solution SQL:

ts                  dif local
2020-03-25 14:09:31 1   2020-03-25 15:09:31
2020-03-31 06:54:08 2   2020-03-31 08:54:08
2020-03-31 14:08:10 2   2020-03-31 16:08:10
2020-04-01 07:23:04 2   2020-04-01 09:23:04
2020-04-01 09:53:19 2   2020-04-01 11:53:19


0 commentaires