Rails: แปลง UTC DateTime เป็นโซนเวลาอื่น


คำตอบ:


206
time.in_time_zone(time_zone)

ตัวอย่าง:

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

หรือเพียงแค่

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

คุณสามารถค้นหาชื่อของโซนเวลา ActiveSupport ได้โดยทำดังนี้

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)

ใน irb เมื่อฉันลองใช้ Time.now.in_time_zone ('CST') ฉันได้รับข้อผิดพลาด "undefined method 'in_time_zone'" มีชั้นเรียนรางที่ฉันต้องการเพื่อให้มันใช้งานได้หรือไม่?
Drew Johnson

คุณใช้ Rails เวอร์ชันใดอยู่ ได้ผลหรือไม่ถ้าคุณทำ Time.zone.now.in_time_zone (... )
mckeed

13
ในการใช้รางภายนอกนี้require 'active_support/time'ก่อนอื่น
sunaku

3
rake time:zones:allคุณสามารถแสดงรายการทุกโซนเวลาโดยการทำงาน ดูrake -D timeด้วย config/application.rbตั้งค่าเขตเวลาเริ่มต้นใน
user664833

1
@AdamEberlin ใน Rails คุณมักจะใช้ ActiveSupport :: TimeWithZone ไม่ใช่ DateTime รหัสทั้งหมดนี้ใช้ได้กับวัตถุ Ruby DateTime เช่นเดียวกับวัตถุ Time
mckeed

6

หากTime.zoneเป็นเขตเวลาที่คุณต้องการคุณสามารถใช้@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 

ไม่ทำงานบน Rails 5 `Time.zone # => Europe / Paris my_date # => พ. 29 มี.ค. 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => พุธที่ 29 มีนาคม 2560 17:00:20 +0000`
Cyril Duchon-Doris

5

ในทับทิมธรรมดาrequire 'date'ให้ใช้new_offsetวิธีการ:

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

ทดสอบกับ Ruby 2.3.7 ที่มาพร้อมกับ Mac OS X 10.13


3

ลองใช้วัตถุTimeWithZoneของ ActiveSupport ที่จัดการด้วย TimeZone ActiveSupport ยังมีเมธอด in_time_zone สำหรับการแปลงเวลา UTC เป็นเขตเวลา TimeZone ที่ระบุ คำตอบของ mckeed แสดงรหัส


ไวยากรณ์สำหรับการนำเข้า TimeWithZone ในคลาสของฉันคืออะไร หรือฉันจะได้รับมันเป็นค่าเริ่มต้นด้วย Rails?
Drew Johnson

1
ฉันเชื่อว่าคุณได้รับมันโดยปริยาย mckeed มีรหัสที่คุณต้องการ แต่คุณจะไม่เห็นใน irb คุณต้องเรียกใช้ใน Rails
Fred

คุณพูดถูก - ขอบคุณ Fred - มันมาพร้อมกับ Rails โดยค่าเริ่มต้น ฉันกำลังจับฟางพยายามทำให้มันทำงานใน irb
Drew Johnson

3

ในกรณีที่คุณกำลังจัดการกับวัตถุ ActiveRecord ใน Rails

อาจเป็นความคิดที่ดีที่จะใช้Time.use_zoneสำหรับเขตเวลาพื้นฐานตามคำขอที่แทนที่เขตเวลาเริ่มต้นที่ตั้งไว้config.time_zone

รายละเอียดเพิ่มเติมอธิบายได้ที่https://stackoverflow.com/a/25055692/542995


0

ฉันใช้ simple_form ใน Rails 4 และฉันเพิ่งเพิ่มช่องป้อนข้อมูลเป็น

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

ด้วยการโยกย้าย

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end

1
สิ่งนี้ไม่ได้ตอบคำถามว่าคุณแปลงวัตถุ DateTime อย่างไร
zykadelic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.