Trong Ruby / Rails, làm cách nào để chuyển đổi DateTime UTC sang múi giờ khác?
Trong Ruby / Rails, làm cách nào để chuyển đổi DateTime UTC sang múi giờ khác?
Câu trả lời:
time.in_time_zone(time_zone)
Thí dụ:
zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)
hoặc chỉ
Time.now.in_time_zone("Central Time (US & Canada)")
Bạn có thể tìm thấy tên của múi giờ ActiveSupport bằng cách thực hiện:
ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
require 'active_support/time'
trước tiên.
rake time:zones:all
. Cũng xem rake -D time
. Đặt múi giờ mặc định trong config/application.rb
.
nếu Time.zone
đó là múi giờ mong muốn của bạn thì bạn có thể sử dụng@date.to_time.to_datetime
> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100
Đối với ruby đơn thuần, chỉ với require 'date'
, sử dụng new_offset
phương pháp:
require 'date'
d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"
Đã thử nghiệm với ruby 2.3.7 đạt tiêu chuẩn trên Mac OS X 10.13.
Thử các đối tượng TimeWithZone của ActiveSupport được thao tác với TimeZone. ActiveSupport cũng cung cấp phương thức in_time_zone để chuyển đổi thời gian UTC sang múi giờ TimeZone được chỉ định. câu trả lời của mckeed hiển thị mã.
Chỉ trong trường hợp, nếu bạn đang xử lý đối tượng ActiveRecord trong Rails.
Có thể là một ý tưởng hay khi sử dụng Time.use_zone
cho múi giờ cơ sở cho mỗi yêu cầu ghi đè múi giờ mặc định được đặt trongconfig.time_zone
Tôi giải thích thêm chi tiết tại https://stackoverflow.com/a/25055692/542995
Tôi đang sử dụng simple_form trong Rails 4 và tôi vừa thêm trường đầu vào là
<%= f.input :time_zone, :as => :time_zone %>
với sự di cư
class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
def change
add_column :textmessages, :time_zone, :string
end
end