web-dev-qa-db-fra.com

Les horodatages Unix sont-ils le meilleur moyen de stocker des horodatages?

J'utilise toujours des horodatages Unix pour tout, mais je me demande s'il y a une meilleure façon.

Qu'utilisez-vous pour stocker les horodatages et pourquoi?

52
Rich Bradshaw

Quelle que soit la façon dont vous choisissez de stocker un horodatage, il est important d'éviter les problèmes d'interprétation régionaux et les problèmes de décalage temporel. Un horodatage Unix est interprété de la même manière, quelle que soit la région, et est calculé à partir du même point dans le temps, quel que soit le fuseau horaire - ce sont de bonnes choses.

Méfiez-vous de stocker des horodatages sous forme de chaînes ambiguës comme 01/02/2008, car cela peut être interprété comme 02 janvier 2008 ou 01 février 2008, selon les paramètres régionaux.

Lors du stockage des heures/minutes/secondes, il est important de savoir "quelle" heure/minute/seconde est spécifiée. Vous pouvez le faire en incluant des informations de fuseau horaire (non nécessaires pour un horodatage Unix, car il est supposé être UTC).

Cependant, notez que les horodatages Unix ne peuvent pas représenter de manière unique certains instants dans le temps: quand il y a une seconde intercalaire en UTC, l'horodatage Unix ne change pas, donc 23:59:60 UTC et 00:00:00 le lendemain ont la même Représentation Unix. Donc, si vous avez vraiment besoin d'une seconde ou d'une meilleure résolution, envisagez un autre format.

Si vous préférez un format de stockage plus lisible par l'homme qu'un horodatage Unix, pensez à ISO 8601 .

Une technique qui aide à garder les choses simples consiste à stocker les dates au format UTC et à appliquer uniquement des décalages de fuseau horaire ou DST lors de l'affichage d'une date à un utilisateur.

88
J c

Si vous stockez un fichier journal, veuillez, pour l'amour de Pete, en faire quelque chose de lisible par l'homme et triable lexicalement.

2008-10-07 09:47:02 par exemple.

26
Ryan

les horodatages Unix 32 bits déborderont dans quelques années (janvier 2038) , donc cela pourrait être une considération. J'utilise généralement un format DATETIME en SQL, qui est AAAA-MM-JJ HH: MM: SS avec l'heure comme une horloge de 24 heures. J'essaie de sortir des fichiers dans le même format, juste pour me faciliter la vie.

14
Thomas Owens

Quelle ère devez-vous stocker et à quelle résolution? Si vous avez besoin de microsecondes ou de dates dans l'âge de pierre, time_t n'est peut-être pas le meilleur. À des fins commerciales générales, c'est assez bon (en supposant 64 bits)

6
Martin Beckett

Cela dépend de la raison pour laquelle vous avez besoin des horodatages.

Un horodatage Unix ne peut pas représenter l'heure 1 seconde après le 2008-12-31T23: 59: 59Z. Si vous faites '2009-01-01T09: 00: 00' - '2008-12-31T09: 00: 00' avec les horodatages Unix, le résultat n'est PAS correct: il y aura une seconde intercalaire entre ces deux dates et elles sont séparées par 86401 secondes (pas 86400 comme les horodatages Unix vous le diront).

Autre que cela et ce que les autres répondants ont dit, oui - les horodatages Unix sont la voie à suivre :)

4
pmg

Un horodatage n'est pas une bonne idée sur les bases de données, car elles ne prennent pas en compte l'heure d'été ou l'heure locale actuelle. Sur MySQL, il est préférable de le stocker en tant qu'heure, puis d'utiliser les fonctions de date et d'heure de MySQL pour récupérer les parties que vous souhaitez, ou comparer à d'autres dates.

4
Marius

style timeval (time_t + microsecondes) si j'ai besoin d'une précision inférieure à la seconde, sinon juste time_t. Vous pouvez utiliser une valeur entière 64 bits pour stocker time_t * 1000000 + usec et vous êtes à l'épreuve des débordements pendant plus de +/- 292 000 ans.

2
Bklyn

Le problème UNIX Timestamp 32 bits semble être assez ennuyeux pour les utilisateurs qui entrent des dates futures en 2038+.

Utilisez la séquence DATETIME pour MySQL ou stockez vos dates sous forme de BIGINT (8) non signé (max: 18 quintillions) ou FLOAT pour pouvoir saisir de grands nombres. Ensuite, vous ne pouvez pas utiliser par exemple la fonction date () de PHP car elle n'autorise que les entiers comme paramètre (limité par les systèmes 32 bits).

La solution que j'ai trouvée est d'utiliser les fonctions PHP 5.2.0 . Voici la DateTime PHP .

Pas besoin de changer le format UNIX_TIMESTAMP. Tant que vous avez BIGINT (8) non signé comme stockage MySQL pour les horodatages. Vous ne serez plus limité par les systèmes 32 bits.

1
Dexter

Un horodatage est fondamentalement:

  • un moment précis

Et comme un point dans le temps a une résolution sans fin, l'important pour choisir un format d'horodatage est: a-t-il une résolution suffisante?

Pour la plupart des applications que j'avais, les nanosecondes suffisaient. Donc Java Timestamp avait la bonne résolution pour moi jusqu'à présent.

0
Andre Bossard