2012-07-12 33 views
29

Tôi đã đặt múi giờ ở /config/application.rb và tôi hy vọng tất cả thời gian được tạo trong ứng dụng của tôi ở múi giờ này theo mặc định, nhưng khi tôi tạo đối tượng DateTime mới (sử dụng .new), nó sẽ tạo trong GMT. Làm thế nào tôi có thể làm cho nó được trong múi giờ của ứng dụng của tôi?Cách tạo đối tượng DateTime mới trong một múi giờ cụ thể (tốt nhất là múi giờ mặc định của ứng dụng của tôi, chứ không phải 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 

Sử dụng in_time_zone không hoạt động bởi vì đó chỉ là chuyển đổi thành giờ GMT gian PDT, đó là sai thời gian:

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) 

Trả lời

27

Bạn có thể sử dụng TimeWithZone (Time.zone) đối tượng ActiveSupport để tạo ra và phân tích số ngày theo múi giờ của ứng dụng của bạn:

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

Điều này thực sự hữu ích! Nhưng nếu bạn muốn tạo một Thời gian trong một vùng khác với những gì bạn đã đặt config.time_zone = thành config/application.rb? – idrinkpabst

+0

Tôi sẽ sử dụng một cái gì đó như ''2012-07-11 21: 00'.to_datetime.in_time_zone (' Eastern Time (US & Canada) ')' –

+2

điều này thực sự không hoạt động. giả sử bạn muốn tạo múi giờ trong vùng cho 9 giờ sáng theo hướng Đông. nếu bạn làm '2012-07-11 09: 00'.to_datetime.in_time_zone (' Giờ Miền Đông (Hoa Kỳ & Canada) '), điều này sẽ cho bạn thời gian sai vì nó chuyển đổi từ UTC. nếu bạn làm '2012-07-11 09:00 Giờ Miền Đông (Hoa Kỳ & Canada)' to_datetime.in_time_zone ('Giờ Miền Đông (Hoa Kỳ & Canada)') thì điều này vẫn không hoạt động vì DateTime là không ổn định khi nói đến ánh sáng ban ngày tiết kiệm thời gian. Cách tốt nhất là tránh hoàn toàn DateTime. Bất kỳ ý tưởng? – idrinkpabst

0

Tôi làm như sau trong ApplicationController để đặt múi giờ cho thời gian của người dùng.

Tôi không chắc chắn nếu đây là những gì bạn muốn.

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

Đây không phải là những gì tôi đang tìm kiếm, nhưng nhờ đăng .. có lẽ nó sẽ rất hữu ích cho người khác. – user664833

6

Nếu tôi có nó, tôi thường chỉ xác định utc_offset khi instantiating Time .new hoặc 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

Một cách khác mà không cần phân tích chuỗi:

irb> Time.zone.local(2012, 7, 11, 21) 
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00 
Các vấn đề liên quan