web-dev-qa-db-fra.com

Comment créer un nouvel objet DateTime dans un fuseau horaire spécifique (de préférence le fuseau horaire par défaut de mon application, pas UTC)?

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)
33
user664833

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
11
hangsu

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 
6
ewH

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
2
JustJonG

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
0
drhenner