web-dev-qa-db-fra.com

Comment créer un Ruby DateTime à partir de Time.zone existant pour Rails?

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 DateTimes 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 DateTimes 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?

25
at.

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.

21
user324242

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)")
32
shweta

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

16
SriramK89

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)
3
twnaing

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
1
Adreamus