Comment stocker une datetime dans MySQL avec des informations de fuseau horaire

j'ai des milliers de photos qui ont été prises en Tanzanie et je veux stocker la date et l'heure chaque photo a été prise dans une base de données MySQL. Le serveur, cependant, est situé aux États-Unis et je rencontre des problèmes lorsque j'essaie de stocker une date-heure tanzanienne qui tombe dans l'heure "invalide" pendant l'heure avancée du printemps (aux États-Unis). La Tanzanie ne fait pas L'heure D'été, donc l'heure est une heure valide.

les complications supplémentaires sont qu'il y a des collaborateurs de nombreux temps différents qui auront besoin d'accéder aux valeurs date-heure stockées dans la base de données. Je veux qu'ils sortent toujours comme temps Tanzanien et non pas dans les temps locaux dans lesquels divers collaborateurs sont.

je suis réticent à fixer des heures de session parce que je sais qu'il y aura des problèmes quand quelqu'un oubliera de temps en temps de fixer une heure de session et obtiendra les heures tout faux. Et je n'ai pas le pouvoir de changer quoi que ce soit sur le serveur.

j'ai lu: pratiques exemplaires relatives à l'heure avancée et aux fuseaux horaires et les champs datetime de MySQL et de l'heure d'été -- comment dois-je faire référence "extra" à l'heure? et Stocking datetime as UTC in PHP /MySQL

mais aucun d'eux ne semble répondre à mon problème particulier. Je ne suis pas un expert SQL; y a-t-il un moyen de spécifier le fuseau horaire lors de la définition des DATETIMEs? Je n'en ai pas vu. Sinon, toute suggestion sur la façon d'aborder cette question est grandement appréciée.

Edit: Voici un exemple du problème que je rencontre. J'envoie la commande:

INSERT INTO Images (CaptureEvent, SequenceNum, PathFilename, TimestampJPG) 
VALUES (122,1,"S2/B04/B04_R1/IMAG0148.JPG","2011-03-13 02:49:10")

et je reçois l'erreur:

Error 1292: Incorrect datetime value: '2011-03-13 02:49:10' for column 'TimestampJPG'

Cette date et le temps existe en Tanzanie, mais pas aux états-UNIS, où la base de données.

48
demandé sur Community 2013-11-07 21:56:32

2 réponses

vous avez dit:

je veux qu'ils sont toujours Tanzaniens le temps et non dans les locaux de fois que les différentes collaborateur.

si c'est le cas, vous devez et non utiliser UTC. Tout ce que vous devez faire est d'utiliser un type DATETIME dans MySQL au lieu d'un type TIMESTAMP .

de la documentation MySQL :

MySQL convertit les valeurs TIMESTAMP du fuseau horaire courant en UTC pour le stockage, et vice versa du UTC au fuseau horaire courant pour la récupération. (Cela ne se produit pas pour d'autres types tels que DATETIME .)

si vous êtes déjà en utilisant un type DATETIME , alors vous ne devez pas le définir à l'heure locale pour commencer. Vous aurez besoin de se concentrer moins sur la base de données, et plus sur votre code d'application - qui vous n'avez pas de montrer ici. Le problème, et la solution, variera radicalement en fonction de la langue, alors assurez-vous d'étiqueter la question avec la langue appropriée de votre code d'application.

39
répondu Matt Johnson 2013-11-07 21:08:46

tous les symptômes que vous décrivez suggèrent que vous ne dites jamais MySQL quel fuseau horaire utiliser de sorte qu'il est par défaut à la zone du système. Pensez-y: si tout ce qu'il a est '2011-03-13 02:49:10' , comment peut-il deviner qu'il s'agit d'une date locale tanzanienne?

autant que je sache, MySQL ne fournit aucune syntaxe pour spécifier les informations de fuseau horaire dans les dates. Vous devez le changer en par connexion base ; quelque chose comme:

SET time_zone = 'EAT';

si ce n'est pas travail (pour utiliser les zones nommées, vous avez besoin que le serveur a été configuré pour le faire et ce n'est souvent pas le cas), vous pouvez simplement utiliser les offsets UTC:

SET time_zone = '+03:00';
5
répondu Álvaro González 2017-05-23 11:47:09