2012-07-12 12 views
29

我已經在/config/application.rb中設置了時區,我預計在我的應用程序中生成的所有時間默認都在此時區,但是當我創建新的DateTime對象(使用.new)時,它會在GMT中創建它。我怎樣才能讓它在我的應用程序的時區?如何在特定時區(最好是我的應用程序的默認時區,而不是UTC)中創建新的DateTime對象?

/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 

使用in_time_zone不起作用,因爲這只是轉換GMT時間PDT時間,這是錯誤的時間:

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) 

回答

27

可以使用的ActiveSupport的TimeWithZoneTime.zone)對象在應用程序的時區創建和解析日期:

1.9.3p0 :001 > Time.zone.now 
=> Wed, 11 Jul 2012 19:47:03 PDT -07:00 
1.9.3p0 :002 > Time.zone.parse('2012-07-11 21:00') 
=> Wed, 11 Jul 2012 21:00:00 PDT -07:00 
+1

這真的很有幫助!但是如果你想在一個不同於你在config/application.rb中設置config.time_zone =的區域創建一個時間? – idrinkpabst 2013-07-31 22:28:40

+0

我會用'2012-07-11 21:00'.to_datetime.in_time_zone('東部時間(美國和加拿大)')' – 2013-08-01 01:05:41

+2

'這實際上不起作用。假設您想在東部時間上午9點創建時區。如果你做'2012-07-11 09:00'.to_datetime.in_time_zone('東部時間(美國和加拿大)'),這會讓你回到錯誤的時間,因爲它是從UTC轉換而來的。如果你做'2012年7月11日09:00東部時間(美國和加拿大)'。to_datetime.in_time_zone('東部時間(美國和加拿大)')這仍然無法正常工作,因爲日期時間是棘手的,當談到日光節省時間。最好完全避免使用DateTime。有任何想法嗎? – idrinkpabst 2013-08-01 20:01:40

0

我在ApplicationController中執行下列操作將時區設置爲用戶的時間。

我不確定這是你想要的。

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

這不是我一直在尋找,但感謝張貼...也許這將有助於別人。 – user664833 2012-07-12 04:10:17

6

如果我有它,我通常只是實例化時間時指定utc_offset .new或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 
8

的另一種方式,而不字符串解析:

irb> Time.zone.local(2012, 7, 11, 21) 
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00 
相關問題