Rails: ubah UTC DateTime ke zona waktu lain

Jawaban:

206
time.in_time_zone(time_zone)

Contoh:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

atau hanya

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

Anda dapat menemukan nama zona waktu ActiveSupport dengan melakukan:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
mckeed
sumber
Di irb, ketika saya mencoba Time.now.in_time_zone ('CST'), saya mendapatkan error "metode tidak ditentukan 'in_time_zone'". Apakah ada kelas rel yang saya perlukan agar ini berfungsi?
Drew Johnson
Versi Rails mana yang Anda gunakan? Apakah ini berfungsi jika Anda menggunakan Time.zone.now.in_time_zone (...)?
mckeed
13
Untuk menggunakan ini di luar Rails, require 'active_support/time'pertama.
sunaku
3
Anda dapat membuat daftar semua zona waktu dengan menjalankan rake time:zones:all. Lihat juga rake -D time. Setel zona waktu default di config/application.rb.
pengguna664833
1
@AdamEberlin Dalam Rails Anda biasanya menggunakan ActiveSupport :: TimeWithZone, bukan DateTime. Semua kode ini berfungsi pada objek DateTime ruby ​​serta objek Time.
mckeed
6

jika Time.zoneitu zona waktu yang Anda inginkan maka Anda dapat menggunakan@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 
vladCovaliov
sumber
Tidak berfungsi pada Rails 5 `Time.zone # => Europe / Paris my_date # => Wed, 29 Mar 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => Rab, 29 Mar 2017 17:00:20 +0000`
Cyril Duchon-Doris
5

Di ruby ​​biasa, dengan hanya require 'date', gunakan new_offsetmetode:

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')}"

Diuji dengan ruby ​​2.3.7 yang menjadi standar pada Mac OS X 10.13.

jbyler
sumber
3

Coba ActiveSupport ini TimeWithZone benda dimanipulasi dengan TimeZone. ActiveSupport juga menyediakan metode in_time_zone untuk mengonversi waktu UTC ke zona waktu TimeZone yang ditentukan. jawaban mckeed menunjukkan kodenya.

Fred
sumber
Apa sintaks untuk mengimpor TimeWithZone ke kelas saya? Atau apakah saya mendapatkannya secara default dengan Rails?
Drew Johnson
1
Saya yakin Anda mendapatkannya secara default. mckeed memiliki kode yang Anda butuhkan, tetapi Anda tidak akan melihatnya di irb. Anda perlu menjalankannya di Rails.
Fred
Anda benar - terima kasih, Fred - ini memang datang dengan Rails secara default. Saya menggenggam sedotan, mencoba membuatnya bekerja di irb.
Drew Johnson
3

Untuk berjaga-jaga, jika Anda berurusan dengan objek ActiveRecord di Rails.

Sebaiknya gunakan Time.use_zonezona waktu berdasarkan permintaan yang menggantikan zona waktu default yang disetelconfig.time_zone

Lebih jelasnya saya jelaskan di https://stackoverflow.com/a/25055692/542995

zdk
sumber
0

Saya menggunakan simple_form di Rails 4 dan saya baru saja menambahkan kolom input sebagai

<%= f.input :time_zone, :as => :time_zone %>

dengan migrasi

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end
maudulus
sumber
1
Ini tidak menjawab pertanyaan tentang bagaimana Anda mengonversi objek DateTime
zykadelic