2013-04-06 1 views
17

Ich habe Benutzer in Daten auf einer Ruby on Rails-Website eingeben. Ich analysiere die Daten in ein Datetime-Objekt mit so etwas wie:Wie erstellt man eine Ruby DateTime aus der vorhandenen Time.zone für Rails?

date = DateTime.new(params[:year].to_i, params[:month].to_i, params[:day].to_i, params[:hour].to_i, params[:minute].to_i) 

oder

date = DateTime.parse(params[:date]) 

Beide DateTime s wird nicht in der Zeitzone des Benutzers sein, die ich vorher mit etwas gesetzt wie:

Time.zone = "Pacific Time (US & Canada)" 

Wie analysieren wir die oben DateTime s in der richtigen Zeitzone sein? Ich weiß, dass die DateTime.new Methode ein 7. Argument für den Zeitversatz hat. Gibt es eine einfache Möglichkeit, den Offset für eine Zeitzone in einer bestimmten Zeit nachzuschlagen? Oder sollte ich etwas anderes als DateTime verwenden?

Antwort

18

können Sie Time.zone.local verwenden, wenn Sie Time.zone vorher eingestellt:

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) 

Werfen Sie einen Blick auf die ActiveSupport::TimeWithZone Dokumentation.

+2

für jedermann mit einem Railscasts.com pro Konto: http://railscasts.com/episodes/106-time-zones-revised – wintermeyer

+0

@wintermeyer ich nur wegen dir zu Railscasts abonniert, danke. –

12

Sie können den folgenden Code verwenden, um ein DateTime Objekt mit Ihrem gewünschten TimeZone zu erstellen.

DateTime.new(2013, 6, 29, 10, 15, 30).change(:offset => "+0530") 
+2

Und von Ihnen haben Sie eine bereits vorhandene Zeit mit einer Zeitzone, die Sie tun können DateTime.new (2013, 6,29,10,15,30) .change (: offset => known_time.zone) – Adreamus

+0

Dies führt nicht zu der gewünschter Wert. Der Punkt ist, dass die Zeit "10:15:30" in der gewünschten Zeitzone sein sollte, und man will einen Wert herausholen, der: (byebug) p DateTime.new (2015,12,27,0,0, 0) .change (: offset => 'America/New_York') So, 27 Dez. 2015 00:00:00 +0000 – mcr

1

Wenn Sie bereits ein korrektes Datetime-Objekt mit dem Namen ‚Datetime‘, und Sie wollen es kopieren, können Sie rufen Sie einfach die ‚getutc‘ darauf und danach die ‚in_time_zone‘ verwenden

DateTime.new(datetime.getutc.year, datetime.getutc.month, datetime.getutc.day, time.getutc.hour, time.getutc.min).in_time_zone 
27

Versuchen:

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 

ODER

Time.now.in_time_zone("Pacific Time (US & Canada)") 

OR

DateTime.now.in_time_zone("Pacific Time (US & Canada)")