2008-11-26 10 views
2

J'ai posté une question plus tôt aujourd'hui alors que je ne m'étais pas vraiment concentré sur le problème. Je serai capable d'être plus concis ici. Je cours RoR 2.1.2, sur Windows, avec MySQL. Le fuseau horaire natif du serveur SQL est UTC. Mon fuseau horaire local est du Pacifique (-0800)Les scripts autonomes Ruby on Rails et Active Record sont en désaccord sur les valeurs de la base de données pour: timestamps

J'ai un modèle avec: colonne de type d'horodatage que je peux faire des choses comme ça avec:

record = Record.find(:first) 
record.the_time = Time.now() 

Quand je fais un « select * from enregistrements » dans la base de données, l'heure indiquée est de huit heures avant mon heure locale, ce qui est correct, étant donné que la base de données est sur UTC. (J'ai vérifié qu'il est 'think in utc' avec un simple 'select now()' et 'select utc_timestamp()')

C'est là que le problème commence. Si j'affiche l'heure dans une vue:

<%= h record.the_time %> 

... puis je récupère l'heure correcte, affichée au format UTC. Si j'écrivais dans la base de données à 16:40:00 heure locale, la base de données indiquait 00:40:00.

Cependant, si je suis en cours d'exécution d'un script autonome:

record = Record.find(:first) 
puts record.the_time 

... je reviens l'heure UTC que je stockées dans la base (0:40:00), mais avec le fuseau horaire local :

Wed Nov 26 00:40:00 (-0800) 2008 

... une distorsion temporelle de huit heures. Pourquoi est-ce que le fait de stocker le temps le traduit correctement, mais ne le récupère pas? Si je compare un temps passé du passé récent dans la base de données et que je le compare à l'heure actuelle, l'heure actuelle est moins longue - me disant que ce n'est pas seulement un problème de conversion de chaîne.

Des idées?

Répondre

0

en fin de compte, il était beaucoup plus facile de le faire en stockant les temps comme un entier (Time.now(). To_i()) et les convertir à un moment où j'avais besoin de les afficher (Time.at (the_time_the_database_returned_to_me).) Ce n'est pas la meilleure solution, mais c'était la seule qui fonctionnait.

0

Eh bien, vous n'avez pas commenté ma dernière suggestion pour redémarrer votre serveur ou votre console.

J'ai eu un problème similaire et il a été réparé quand je l'ai fait.

Vous mentionnez également un script autonome, mais pour obtenir la fonction de fuseau horaire de Rails, le code doit être exécuté dans Rails.

1

Il existe un paramètre dans config/environment.rb qui définit un fuseau horaire. Peut-être ce paramètre est réglé pas la même chose dans votre script:

# Make Time.zone default to the specified zone, and make Active Record store time values 
# in the database in UTC, and return them converted to the specified local zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time. 
config.time_zone = 'UTC' 

Vous pouvez également essayer de spécifier explicitement le TZ et format:

require 'active_support/core_ext/date/conversions' 
record.the_time.utc.to_s(:db) 

(ou de tricher et de saisir le fragment de code à partir de là si vous êtes ne pas utiliser active_support dans votre script autonome)

1

Essayez nécessitant active_support