115 votes

Sqlite: CURRENT_TIMESTAMP est en GMT, pas le fuseau horaire de la machine

J'ai un sqlite (v3) de la table avec cette définition de la colonne:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

Le serveur que cette base de données qui vit sur c'est dans le CST fuseau horaire. Lorsque je l'insère dans ma table sans y compris la colonne timestamp, sqlite remplit automatiquement le champ avec le timestamp actuel en GMT, pas de CST.

Est-il un moyen de modifier mon instruction insert pour forcer le timestamp stocké pour être dans la CST? D'autre part, il est probablement préférable de le stocker dans l'heure GMT (dans le cas où la base de données est déplacé à un autre fuseau horaire, par exemple), donc est il possible que je peux modifier mon sélectionnez SQL pour convertir le timestamp stocké à CST quand j'ai extrait de la table?

138voto

BrianH Points 2782

J'ai trouvé sur le sqlite wiki (http://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions) ce texte:

Calculer la date et l'heure donné un unix timestamp 1092941466, et de compenser pour votre fuseau horaire local.

SELECT datetime(1092941466, 'unixepoch', 'localtime');

Qui ne ressemble pas à l'adapter à mes besoins, j'ai donc essayé de changer le "datetime" fonction autour de un peu, et se retrouve avec ceci:

select datetime(timestamp, 'localtime')

Qui semble fonctionner - est-ce la bonne façon de les convertir pour votre fuseau horaire, ou est-il une meilleure façon de le faire?

61voto

hoju Points 7182

utilisez simplement l'heure locale par défaut:

 CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
 

15voto

Roger Lipscombe Points 34344

Vous pouvez, en règle générale, laissez les horodatages dans la base de données en GMT, et de convertir de l'heure locale sur l'entrée/sortie, quand vous pouvez les convertir à l'utilisateur (pas de serveur) timestamp local.

Il serait bien si vous pouviez faire ce qui suit:

SELECT DATETIME(col, 'PDT')

...à la sortie de l'horodatage pour l'utilisateur, Heure Avancée du Pacifique. Malheureusement, cela ne fonctionne pas. Selon cette SQLite tutoriel, cependant (faites défiler jusqu'à "d'Autres la Date et l'Heure de Commandes"), vous pouvez demander pour le moment, et ensuite appliquer un décalage (en heures) en même temps. Alors, si vous ne le savez l'utilisateur du décalage horaire, vous êtes bon.

Ne s'occupe pas de l'heure d'été règles, bien que...

13voto

polyglot Points 3627

Dans l' (admis rares) cas d'un local datatime est voulu (j'ai, par exemple, de stocker, heure locale, dans un de ma base de données depuis tous les soins, je est quelle heure de la journée et je ne pas garder trace de l'endroit où j'étais en terme de zones de temps...), vous pouvez définir la colonne

"timestamp" TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M','now', 'localtime'))

L' %Y-%m-%dT%H:%M partie est bien sûr facultatif; il est juste la façon dont je l'aime bien, de temps à être stockés. [Aussi, si mon impression est correcte, il n'y a pas de "DATETIME" type de données de sqlite, donc il n'a pas vraiment d'importance si le TEXTE ou DATETIME est utilisée comme type de données dans la colonne déclaration.]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X