Des utilisateurs saisissent des dates dans un site Web Ruby on Rails. J'analyse les dates dans un objet DateTime avec quelque chose comme:
date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i)
ou
date = DateTime.parse(params[:date])
Les deux DateTime
s pas seront dans le fuseau horaire de l'utilisateur que j'ai précédemment défini avec quelque chose comme:
Time.zone = "Pacific Time (US & Canada)"
Comment analyser les DateTime
s ci-dessus pour être dans le bon fuseau horaire? Je sais que la méthode DateTime.new
A un 7ème argument pour le décalage temporel. Existe-t-il un moyen simple de rechercher le décalage d'un fuseau horaire à une heure donnée? Ou devrais-je utiliser autre chose que DateTime
?
Vous pouvez utiliser Time.zone.local
si vous définissez Time.zone
auparavant:
user_time = Time.zone.local(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i, 0)
Jetez un oeil à la ActiveSupport::TimeWithZone
documentation.
Essayer:
Time.zone = "Pacific Time (US & Canada)"
Time.zone.parse('8-11-2013 23:59:59') #=> Fri, 08 Nov 2013 23:59:59 PST -08:00
OR
Time.now.in_time_zone("Pacific Time (US & Canada)")
OR
DateTime.now.in_time_zone("Pacific Time (US & Canada)")
Vous pouvez utiliser le code suivant pour créer un objet DateTime
avec votre TimeZone
souhaité.
DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530")
[~ # ~] mise à jour [~ # ~] : Avec nouveau Version 1.9.1 de Rails Ruby, la ligne ci-dessous fait le même travail comme une magie.
DateTime.new(2013, 6, 29, 10, 15, 30, "+0530")
Documentation ici
DateTime.new
accepte optionnel offset (comme le septième) à partir de Ruby 1.9.1
Nous pouvons écrire
DateTime.new(2018, 1, 1, 0, 0, 0, Time.zone.formatted_offset)
Si vous avez déjà un objet DateTime correct avec le nom 'datetime' et que vous souhaitez le copier, vous pouvez simplement appeler le 'getutc' dessus et ensuite utiliser le 'in_time_zone'
DateTime.new(datetime.getutc.year, datetime.getutc.month, datetime.getutc.day, time.getutc.hour, time.getutc.min).in_time_zone