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)

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 

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.


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.


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


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

1
Ini tidak menjawab pertanyaan tentang bagaimana Anda mengonversi objek DateTime
zykadelic
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.