2013-04-06 13 views
17

Tôi có người dùng nhập ngày trong trang web Ruby on Rails. Tôi phân tích ngày vào một đối tượng DateTime với một cái gì đó như:Cách tạo một DateTime của Ruby từ Time.zone hiện tại cho Rails?

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

hoặc

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

Cả DateTime s sẽ không được theo múi giờ của người sử dụng mà tôi trước đây thiết lập với một cái gì đó như:

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

Làm cách nào để phân tích cú pháp ở trên DateTime s ở đúng múi giờ? Tôi biết phương pháp DateTime.new có đối số thứ 7 cho khoảng thời gian bù. Có một cách dễ dàng để tìm kiếm bù đắp cho một múi giờ trong một thời gian nhất định? Hoặc tôi có nên sử dụng thứ gì đó khác ngoài DateTime không?

Trả lời

18

Bạn có thể sử dụng Time.zone.local nếu bạn thiết lập Time.zone trước:

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) 

Có xem xét các tài liệu ActiveSupport::TimeWithZone.

+2

Đối với bất cứ ai với một Railscasts.com tài khoản pro: http://railscasts.com/episodes/106-time-zones-revised – wintermeyer

+0

@wintermeyer Tôi chỉ đăng ký railscasts vì bạn, cảm ơn. –

12

Bạn có thể sử dụng mã sau để tạo đối tượng DateTime với mong muốn TimeZone của mình.

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

Và trong số các bạn có một khoảng thời gian đã tồn tại với múi giờ đã đặt, bạn có thể thực hiện DateTime.new (2013, 6,29,10,15,30) .change (: offset => known_time.zone) – Adreamus

+0

Điều này không dẫn đến giá trị mong muốn. Vấn đề là thời gian "10:15:30" phải ở trong múi giờ mong muốn, và người ta muốn nhận được một giá trị mà: (byebug) p DateTime.new (2015,12,27,0,0, 0) .change (: offset => 'America/New_York') Chủ nhật, ngày 27 tháng 12 năm 2015 00:00:00 +0000 – mcr

1

Nếu bạn đã có một đối tượng DateTime đúng với tên 'datetime', và bạn muốn sao chép nó, bạn chỉ có thể gọi là 'getutc' vào nó và sau đó sử dụng 'in_time_zone'

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

Hãy thử:

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 

HOẶC

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

HOẶC

DateTime.now.in_time_zone("Pacific Time (US & Canada)") 
Các vấn đề liên quan