2010-01-04 7 views
2

Je lis un timestamp mysql ne peut contenir une valeur de 19700101000000 à l'année 2037. Je doute sérieusement que mon application sera autour alors, eh bien Je suis sûr que ce n'est pas le cas, mais quelle idée les gens vont-ils utiliser pour un horodatage, un champ de texte?Dois-je utiliser un timestamp ou un champ de texte dans MySQl pour l'heure/date UTC?

Ci-dessous un exemple de la façon dont j'insère actuellement un enregistrement mysql avec un champ mysql datetime et vous pouvez voir que j'utilise maintenant() dans le PHP ci-dessous, maintenant je suis Recodification mon site et je vais Offrir un support de fuseau horaire pour afficher les heures correctes aux utilisateurs, j'ai donc besoin d'enregistrer la date et l'heure comme un horodatage UTC.

<?PHP 
$sql = "INSERT INTO online_users 
    (user_id, 
    online_id, 
    ip, 
    datetime, 
    location, 
    gender) 
    values ('$cache->userid,$unid,$LOCALIP,NOW(),$location,$g)"; 
executeQuery($sql); 
?> 

Sur la base de mon code ci-dessus et mes informations ci-dessus, comment pourrais-je formater ce code pour insérer l'heure et la date en UTC et dois-je utiliser un champ d'horodatage ou d'un champ de texte dans MySQL? Je devrai modifier l'heure de mon php en le montrant souvent, par exemple sur certains posts je calcule le temps qui s'est écoulé depuis le temps mysql (2 jours et 4 heures et 34 secondes). J'ai également besoin de temps pour faire des recherches sur des choses comme des utilisateurs la semaine dernière pour m'inscrire. Je ne demande pas comment faire ce genre de choses que je viens de publier pour montrer ce que je vais utiliser le temps juste au cas où cela aiderait à déterminer la meilleure méthode que je devrais enregistrer comme.

Répondre

1

J'ai tout essayé mentionné dans cette question/réponse, mais rien ne fonctionnait correctement, à la fin de la seule façon que j'ai pu obtenir php timezones La fonction date_default_timezone_set() pour fonctionner correctement avec ma date et les heures de mysql était de les stocker comme un entier et ensuite cela fonctionne parfaitement. Il n'y a pas de problème de tri plus lent pour moi parce que je trier par numéro d'identification au lieu de date mais de trier par date je ne pense pas que ce serait trop difficile une fois que j'ai compris combien de secondes sont entre les deux. Lorsque j'utilise un champ entier dans mysql, je peux stocker un horodatage UTC comme ceci 1262658989. Lorsque vous utilisez un champ timestamp ou datetime dans mysql, il le convertit automatiquement en ce style 2003-04-14 00:00: 00, ce qui rend le travail avec les fuseaux horaires difficile.

En utilisant un entier plutôt que je peux obtenir l'horodatage UTC en PHP en utilisant ce code:

gmdate('U', time()) 
+0

NOTE: La fonction UNIX_TIMESTAMP() de MySQL retournera la valeur entière réelle d'une colonne TIMESTAMP, sans conversion. (Cela vous donne le même ensemble de résultats, renvoyant une valeur INTEGER de la base de données.) Comme vous le constatez, le problème que vous devez gérer avec un type de données TIMESTAMP (ou INTEGER) dans la base de données est implicite. – spencer7593

0

Je voudrais utiliser le champ d'horodatage pour les dates, car il fera trier/filtrer plus rapidement que ce serait sur un champ de texte. Dans 26 ans, vous pouvez revenir avec nous pour savoir ce que vous devez faire pour passer Y2K37.

;-)

3

La meilleure colonne pour stocker datetimes est un DATETIME. Il simplifie votre code et vos requêtes, car vous n'avez pas besoin de convertir en continu les timestamps entiers, et MySQL gère toute la logique de comparaison des dates pour vous.

Vous pouvez utiliser MySQL UTC_DATE(), UTC_TIME() et UTC_TIMESTAMP() fonctions en place de NOW() pour obtenir les horodatages UTC en cours à l'intérieur de MySQL.

+0

+1 pour les fonctions PHP supplémentaires pertinentes. –

+0

Si vous utilisiez une colonne TIMESTAMP, MySQL convertirait automatiquement toutes les dates en UTC, sans avoir besoin de fonctions spéciales UTC_ *. –

+0

Maintenant, je suis vraiment confus, je sais que vous êtes une source fiable mais j'ai lu encore et encore que je ne devrais plus utiliser DATETIME si je voudrais convertir des fuseaux horaires. J'adore la simplicité de faire des conversions avec DATETIME mais date_default_timezone_set ($ _ SESSION ['time_zone']); stil convertir correctement, j'étais assez sûr que pour date_default_timezone_set faire c'est magique que je devais utiliser un horodatage UTC? – JasonDavis

0

Si vous avez besoin de prendre en charge des fuseaux horaires différents, le choix le plus judicieux pour les dates serait le type de colonne TIMESTAMP, même s'il n'a qu'une plage allant jusqu'à 2038-01-19 03:14:07. Cela vous donnerait encore 28 ans pour réfléchir à la façon de résoudre ce problème. L'avantage d'utiliser un type de colonne TIMESTAMP est que toutes les dates sont sauvegardées en UTC et converties en temps voulu sur demande. De cette façon, vous n'avez pas à vous soucier autant des fuseaux horaires. Cependant, cela ne résout pas tous vos problèmes.

+0

Les TIMESTAMPS sont sauvegardés en UTC, mais les instructions SELECT les sortent comme n'importe quel fuseau horaire de votre système. Ainsi, sauf si vous définissez l'heure de votre système sur UTC, vous n'obtenez pas d'horodatage UTC à partir de la base de données. Vous allez toujours devoir le convertir en PHP. – zombat

+0

Quand vous dites que mon système date-t-il de l'endroit où mon serveur et mon serveur mysql sont configurés ou sur mon système/pc à la maison?Si vous voulez dire serveur, peut-être que ce serait une bonne idée de régler le serveur sur UTC car il est dans un fuseau horaire différent. – JasonDavis

+1

Le fuseau horaire MySQL utilisé pour la conversion (y compris SELECT) peut être défini par connexion http: // stackoverflow .com/questions/409286/datetime-vs-timestamp/602038 # 602038 - par conséquent, vous n'avez pas forcément besoin de le convertir du côté PHP. – micahwittman

0

Vous pouvez également utiliser ON UPDATE CURRENT_TIMESTAM P pour mettre à jour le champ whenerevr la ligne est mis à jour

+0

c'est bon à savoir mais pour beaucoup de mes tables cela aurait un mauvais effet quand l'utilisateur éditerait des choses – JasonDavis

2

J'ai toujours stocké époque/heure unix comme un entier signé dans les champs de la base de données. MySQL a & FROM_UNIXTIME() fonctions. Je reçois et je continuerai à recevoir des flaks, mais la date des maths est facile, le support de la langue d'application pour ce format de date est presque omniprésent et je peux maintenir les systèmes opérationnels (par ex. des mises à jour système/exécution.

Certains sites Web ne prennent même pas la peine de convertir des dates et permettent au JavaScript du client de les projeter à l'heure locale.

Les deltas de temps que vous mentionnez (c'est-à-dire, combien de temps entre la dernière vue) peuvent être facilités facilement car vous avez immédiatement le nombre de secondes écoulées.

Questions connexes