ใน Ruby / Rails ฉันจะแปลง UTC DateTime เป็นเขตเวลาอื่นได้อย่างไร
ใน Ruby / Rails ฉันจะแปลง UTC DateTime เป็นเขตเวลาอื่นได้อย่างไร
คำตอบ:
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)
require 'active_support/time'
ก่อนอื่น
rake time:zones:all
คุณสามารถแสดงรายการทุกโซนเวลาโดยการทำงาน ดูrake -D time
ด้วย config/application.rb
ตั้งค่าเขตเวลาเริ่มต้นใน
หาก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
ในทับทิมธรรมดา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
ลองใช้วัตถุTimeWithZoneของ ActiveSupport ที่จัดการด้วย TimeZone ActiveSupport ยังมีเมธอด in_time_zone สำหรับการแปลงเวลา UTC เป็นเขตเวลา TimeZone ที่ระบุ คำตอบของ mckeed แสดงรหัส
ในกรณีที่คุณกำลังจัดการกับวัตถุ ActiveRecord ใน Rails
อาจเป็นความคิดที่ดีที่จะใช้Time.use_zone
สำหรับเขตเวลาพื้นฐานตามคำขอที่แทนที่เขตเวลาเริ่มต้นที่ตั้งไว้config.time_zone
รายละเอียดเพิ่มเติมอธิบายได้ที่https://stackoverflow.com/a/25055692/542995
ฉันใช้ 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