Rails: chuyển đổi UTC DateTime sang múi giờ khác


Câu trả lời:


206
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)

Trong irb, khi tôi thử Time.now.in_time_zone ('CST'), tôi gặp lỗi "phương thức không xác định 'in_time_zone'". Có các lớp đường ray mà tôi cần để làm cho nó hoạt động không?
Drew Johnson

Bạn đang sử dụng phiên bản Rails nào? Nó có hoạt động không nếu bạn làm Time.zone.now.in_time_zone (...)?
mckeed

13
Để sử dụng điều này bên ngoài Rails, require 'active_support/time'trước tiên.
sunaku

3
Bạn có thể liệt kê tất cả các múi giờ bằng cách chạy rake time:zones:all. Cũng xem rake -D time. Đặt múi giờ mặc định trong config/application.rb.
user664833

1
@AdamEberlin Trong Rails, bạn thường sử dụng ActiveSupport :: TimeWithZone, không phải DateTime. Tất cả mã này hoạt động trên các đối tượng DateTime ruby ​​cũng như các đối tượng Thời gian.
dày

6

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 

Không hoạt động trên Rails 5 `Time.zone # => Europe / Paris my_date # => Wed, 29/03/2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => Thứ 4, ngày 29 tháng 3 năm 2017 17:00:20 +0000 '
Cyril Duchon-Doris

5

Đối với ruby ​​đơn thuần, chỉ với require 'date', sử dụng new_offsetphươ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.


3

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ã.


Cú pháp để nhập TimeWithZone vào lớp của tôi là gì? Hay tôi lấy nó theo mặc định với Rails?
Drew Johnson

1
Tôi tin rằng bạn nhận được nó theo mặc định. mckeed có mã bạn cần, nhưng bạn sẽ không thấy nó trong irb. Bạn cần chạy nó trong Rails.
Fred

Bạn nói đúng - cảm ơn, Fred - nó đi kèm với Rails theo mặc định. Tôi đang nắm lấy ống hút, cố gắng làm cho nó hoạt động trong irb.
Drew Johnson

3

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_zonecho 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


0

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

1
Điều này không trả lời cho câu hỏi về cách bạn chuyển đổi các đối tượng DateTime
zykadelic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.