2012-07-12 11 views
29

Ustawiłem strefę czasową w /config/application.rb i domyślnie oczekuję, że wszystkie czasy wygenerowane w mojej aplikacji będą znajdować się w tej strefie czasowej, ale gdy utworzę nowy obiekt DateTime (używając .new), utworzymy go w GMT. Jak mogę to ustawić w strefie czasowej mojej aplikacji?Jak utworzyć nowy obiekt DateTime w określonej strefie czasowej (najlepiej domyślna strefa czasowa mojej aplikacji, a nie UTC)?

/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 

Korzystanie in_time_zone nie działa, ponieważ to właśnie konwertuje czas GMT czasu PDT, która jest źle czas:

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) 

Odpowiedz

27

Można użyć TimeWithZone (Time.zone) obiektu ActiveSupport do tworzenia i analizowania dat w strefie czasowej aplikacji:

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

To jest naprawdę pomocne! Ale co jeśli chcesz stworzyć czas w strefie innej niż ustawiłeś config.time_zone = to w config/application.rb? – idrinkpabst

+0

Użyłbym czegoś takiego jak ''2012-07-11 21: 00'.to_datetime.in_time_zone (' Eastern Time (US & Canada) ')' –

+2

to tak naprawdę nie działa. załóżmy, że chcesz utworzyć strefę czasową dla 9 rano wschodniej. jeśli wykonasz "2012-07-11 09: 00" .to_datetime.in_time_zone ("czas wschodni (USA i Kanada)"), to da ci zły czas, ponieważ konwertuje z UTC. jeśli wykonasz "2012-07-11 09:00 czasu wschodniego (USA i Kanada)" to_datetime.in_time_zone ("czas wschodni (USA i Kanada)") to nadal nie działa, ponieważ DateTime jest paskudny, jeśli chodzi o światło dzienne oszczędność czasu. Najlepiej całkowicie unikać DateTime. Jakieś pomysły? – idrinkpabst

0

Wykonuję następujące czynności w ApplicationController, aby ustawić strefę czasową na czas użytkownika.

Nie jestem pewien, czy tego właśnie chcesz.

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

To nie jest to, czego szukasz, ale Dzięki za komentarz .. być może będzie to pomocne dla kogoś innego. – user664833

6

Jeśli mam to, ja zwykle po prostu określić utc_offset przy uruchamianiu Czas .new lub 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

Innym sposobem bez strun parsowania:

irb> Time.zone.local(2012, 7, 11, 21) 
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00 
Powiązane problemy