2015-09-28 3 views
0

J'ai la colonne Heure dans ma table. et dans /config/application.rb suis ayant l'énoncé suivant. config.time_zone = 'Mumbai'.La colonne Heure n'affiche pas l'heure dans la zone de temps dans laquelle elle est enregistrée, dans Rails?

et iam gagner du temps dans la base de données, avec la requête suivante

punch_rec.check_out = Time.now 
punch_rec.save 

Lorsque je tape la Time.now dans le terminal, il indique l'heure suivante.

2.2.2 :032 > Time.now 
=> 2015-09-28 15:59:06 +0530 

et lorsque je récupère les données de la base de données, le temps qu'il affiche dans UTC time_zone. à cause de cela, à mon avis, le temps affiche mal.

ce sont les étapes de l'exécution de iam.

2.2.2 :038 > p = PunchInOut.find_by_id("28") 
    PunchInOut Load (0.3ms) SELECT `punch_in_outs`.* FROM `punch_in_outs` WHERE `punch_in_outs`.`id` = 28 LIMIT 1 
=> #<PunchInOut id: 28, employee_id: 3, check_in: nil, check_out: nil, date: "2015-09-28", created_at: "2015-09-28 18:37:24", updated_at: "2015-09-28 10:25:22", shift_id: nil, shift_name: nil> 
2.2.2 :039 > p.check_in 
=> nil 
2.2.2 :040 > Time.now 
=> 2015-09-29 00:19:17 +0530 
2.2.2 :041 > p.check_in= Time.now 
=> 2015-09-29 00:19:33 +0530 
2.2.2 :042 > p.save 
    (0.3ms) BEGIN 
    SQL (0.7ms) UPDATE `punch_in_outs` SET `check_in` = '2015-09-28 18:49:33', `updated_at` = '2015-09-28 18:49:38' WHERE `punch_in_outs`.`id` = 28 
    (37.7ms) COMMIT 
=> true 
2.2.2 :043 > p = PunchInOut.find_by_id("28") 
    PunchInOut Load (0.6ms) SELECT `punch_in_outs`.* FROM `punch_in_outs` WHERE `punch_in_outs`.`id` = 28 LIMIT 1 
=> #<PunchInOut id: 28, employee_id: 3, check_in: "2000-01-01 18:49:33", check_out: nil, date: "2015-09-28", created_at: "2015-09-28 18:37:24", updated_at: "2015-09-28 18:49:38", shift_id: nil, shift_name: nil> 
2.2.2 :044 > p.check_in 
=> 2000-01-01 18:49:33 UTC 
2.2.2 :045 > 

comment puis-je résoudre ce problème.

+0

Rails enregistre tous les temps à la base de données en UTC par défaut, puis ils sont affichés ** ** dans le fuseau horaire approprié, en cours de conversion à la volée. Donc, je m'attendrais à ce que la vue montre le temps correctement converti. Pouvez-vous ajouter les informations suivantes à votre question: a) à quelle heure pensez-vous que att.check_out devrait être défini sur b) ce qui est stocké dans la base de données, sans le convertir (regardez dans votre terminal db plutôt que d'utiliser Rails c) ce qui est affiché lorsque vous faites '<% = att.check_out%>' –

+0

@MaxWilliams J'ai mis à jour ma question. – John

+0

@MaxWilliams, si les rails sont sauvegardés à chaque fois en temps UTC. alors quelle est l'utilisation ('config.time_zone = 'Mumbai'') de cette déclaration? que va-t-il faire? – John

Répondre

0

Si votre base de données est configurée pour stocker l'heure en UTC, cette heure sera toujours enregistrée dans UTC, peu importe ce que vous faites dans votre application. Si vous devez afficher cette heure à un utilisateur dont le fuseau horaire est différent de l'UTC, vous devez connaître le fuseau horaire dans lequel il se trouve. Si tous vos utilisateurs sont dans un fuseau horaire spécifique, vous pouvez le coder en dur et l'afficher dans votre application , par exemple quelque chose comme ceci:

<%= p.check_in.in_time_zone('Mumbai').strftime("%H:%M") %> 

Si vos utilisateurs sont dans des fuseaux horaires différents, alors vous devez trouver ce fuseau horaire d'abord, puis vous devez afficher l'heure correctement. Vous pouvez le faire en utilisant des gemmes ou avec JavaScript qui est la solution la plus simple. Cochez cette case article.

0

Peut-être avez-vous un fuseau horaire différent sur votre serveur. Essayez de stocker la valeur comme ceci: p.check_in = Time.zone.now.

La principale différence entre Time.now et Time.zone.now est que le premier utilise le fuseau horaire du serveur, et le second utilise le fuseau horaire application.rb.

Laissez-moi savoir si cela fonctionne :)