J'ai défini le fuseau horaire dans /config/application.rb
, et je m'attends à ce que toutes les heures générées dans mon application soient dans ce fuseau horaire par défaut, mais quand je crée un nouvel objet DateTime
(en utilisant .new
), il le crée dans GMT
. Comment puis-je l'inclure dans le fuseau horaire de mon application?
/ config/application.rb
config.time_zone = 'Pacific Time (US & Canada)'
irb
irb> DateTime.now
=> Wed, 11 Jul 2012 19:04:56 -0700
irb> mydate = DateTime.new(2012, 07, 11, 20, 10, 0)
=> Wed, 11 Jul 2012 20:10:00 +0000 # GMT, but I want PDT
En utilisant in_time_zone
ne fonctionne pas car cela convertit simplement l'heure GMT en heure PDT, ce qui est le mauvais moment:
irb> mydate.in_time_zone('Pacific Time (US & Canada)')
=> Wed, 11 Jul 2012 13:10:00 PDT -07:00 # wrong time (I want 20:10)
Une autre façon sans analyse de chaîne:
irb> Time.zone.local(2012, 7, 11, 21)
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00
Si je l'ai, je spécifie généralement l'utc_offset lors de l'instanciation de Time.new ou DateTime.new.
[1] pry(main)> Time.new(2013,01,06, 11, 25, 00) #no specified utc_offset defaults to system time
=> 2013-01-06 11:25:00 -0500
[2] pry(main)> Time.new(2013,01,06, 11, 25, 00, "+00:00") #UTC
=> 2013-01-06 11:25:00 +0000
[3] pry(main)> Time.new(2013,01,06, 11, 25, 00, "-08:00") #PST
=> 2013-01-06 11:25:00 -0800
Cela peut également être réalisé dans la classe DateTime en incluant le fuseau horaire.
2.5.1 :001 > require 'Rails'
=> true
2.5.1 :002 > mydate = DateTime.new(2012, 07, 11, 20, 10, 0)
=> Wed, 11 Jul 2012 20:10:00 +0000
2.5.1 :003 > mydate = DateTime.new(2012, 07, 11, 20, 10, 0, "PST")
=> Wed, 11 Jul 2012 20:10:00 -0800
ou
https://docs.Ruby-lang.org/en/2.6.0/DateTime.html
2.6.0 :001 > DateTime.new(2012, 07, 11, 20, 10, 0, "-06")
=> Wed, 11 Jul 2012 20:10:00 -0600
2.6.0 :002 > DateTime.new(2012, 07, 11, 20, 10, 0, "-05")
=> Wed, 11 Jul 2012 20:10:00 -0500
Je fais ce qui suit dans ApplicationController pour définir le fuseau horaire à l'heure de l'utilisateur.
Je ne sais pas si c'est ce que tu veux.
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
# current_user.time_zone #=> 'London'
Time.zone = current_user.time_zone if current_user && current_user.time_zone
end
end