จะเปลี่ยนเขตเวลาเริ่มต้นสำหรับ Active Record ใน Rails ได้อย่างไร?


140

ในฉันapplication.rbฉันเจอความคิดเห็นต่อไปนี้

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
 config.time_zone = 'Eastern Time (US & Canada)'

ดังที่คุณเห็นจากด้านบนฉันได้ทำconfig.time_zoneเวลา EST อย่างไรก็ตามยังคงเมื่อสร้างระเบียนในฐานข้อมูลดูเหมือนว่าdatetimeจะถูกจัดเก็บในรูปแบบ UTC

ในความคิดเห็นข้างต้นพวกเขาพูดว่า

... และทำให้ Active Record แปลงโดยอัตโนมัติเป็นโซนนี้ ...

ฉันจะทำสิ่งนั้นและที่ไหน

นอกจากนี้ฉันจะปรับใช้กับ heroku เช่นกันและฉันต้องการให้การตั้งค่าดำเนินการต่อ


ใน MySQL datetime เป็นประเภทของเขตเวลา เช่นอาจเป็นในทุกเขตเวลาที่คุณต้องการ หากคุณถือว่าเป็น UTC ก็ไม่เป็นไร แต่ระวังถ้าใครบางคนดูในฐานข้อมูลของคุณโดยตรงและตีความมันแตกต่างกัน
Vanuan

คำตอบ:


199

ฉันตัดสินใจที่จะรวบรวมคำตอบนี้เพราะคนอื่น ๆ ทั้งหมดดูเหมือนจะไม่สมบูรณ์

config.active_record.default_timezoneกำหนดว่าจะใช้ Time.local (หากตั้งค่าเป็น: local) หรือ Time.utc (หากตั้งค่าเป็น: utc) เมื่อดึงวันที่และเวลาออกจากฐานข้อมูล ค่าเริ่มต้นคือ: utc http://guides.rubyonrails.org/configuring.html


หากคุณต้องการเปลี่ยนเขตเวลาของRailsแต่ยังคงมีActive Recordให้บันทึกในฐานข้อมูลในUTCให้ใช้

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'

หากคุณต้องการเปลี่ยนเขตเวลาRails และมีเวลาเก็บActive Recordในเขตเวลานี้ให้ใช้

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local

คำเตือน : คุณควรคิดอย่างรอบคอบถึงสองครั้งก่อนที่จะบันทึกครั้งในฐานข้อมูลในรูปแบบที่ไม่ใช่ UTC

หมายเหตุ:อย่าลืมที่จะเริ่มต้นเซิร์ฟเวอร์ทางรถไฟของคุณหลังจากการปรับเปลี่ยน
application.rb


จำไว้ว่าconfig.active_record.default_timezoneสามารถรับได้สองค่าเท่านั้น

  • : local (แปลงเป็นเขตเวลาที่กำหนดในconfig.time_zone)
  • : utc (แปลงเป็น UTC)

นี่คือวิธีที่คุณสามารถค้นหาเขตเวลาที่มีอยู่ทั้งหมด

rake time:zones:all

5
ดูเหมือนว่าคำตอบที่สมบูรณ์ / ถูกต้องที่สุด - @Omnipresent
Aegix

2
นี่ควรเป็นคำตอบที่ยอมรับได้ มันสมบูรณ์มากขึ้น
Enrique Moreno Tent

@ Mihai-AndreiDinculescu คุณคิดว่าการเก็บdatetimeค่าในUTCในฐานข้อมูลนั้นดีกว่าหรือเพียงแค่เปลี่ยนค่าในส่วนหน้าเช่นmoment.jsหรือคุณแนะนำให้แสดงข้อมูลนี้ในเขตเวลาที่ถูกต้องสำหรับผู้ใช้ใด ๆ
alexventuraio

@AlexVentura ใช่คนฉลาดกว่าฉันตกลงมานานแล้วว่าการเก็บวันที่ใน UTC เป็นวิธีที่ดีที่สุด
Mihai-Andrei Dinculescu

ใช่ฉันเข้าใจแล้ว แต่คุณแนะนำอะไรให้นำไปใช้ในมุมมองทางรถไฟเพื่อแสดงค่าที่ถูกต้องสำหรับผู้ใช้ที่มีเขตเวลาต่างกัน
alexventuraio

187

เพิ่มการติดตามในapplication.rbงาน

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc

59
มันใช้งานได้สำหรับฉันด้วย:config.time_zone = 'London' config.active_record.default_timezone = :local
Dean Perry

41
คุณสามารถดูเขตเวลาทั้งหมดได้โดยดำเนินการในrails c-ActiveSupport::TimeZone.all.map(&:name)
Dean Perry

5
ขอบคุณมาก! ฉันดิ้นรนกับสิ่งนี้เช่นกัน ฉันมีแอพ PHP เก่าที่สืบทอดมาซึ่งโต้ตอบกับฐานข้อมูล mysql เดียวกันและจัดเก็บทุกครั้งในท้องถิ่น การอัปเดตให้ใช้ UTC ไม่ใช่ตัวเลือก สิ่งที่ฉันไม่เคยประสบความสำเร็จมาก่อน: config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' แต่การตั้งค่าเป็น: สัญลักษณ์ท้องถิ่นทำอุบาย
Matt Hucke

8
คู่มือรางบอกว่าconfig.active_record.default_timezoneควรจะกำหนดให้หรือ:local :utcฉันคิดว่าอย่างอื่นจะมีผลลัพธ์ที่ไม่คาดคิด
เคลวิน

2
คุณสามารถดูเขตเวลาทั้งหมดได้ด้วยการดำเนินการในrake time:zones:all
ออร์แลนโด

34

ฉันมาถึงข้อสรุปเดียวกับ Dean Perry หลังจากความปวดร้าวมากมาย config.time_zone = 'Adelaide'และconfig.active_record.default_timezone = :localเป็นส่วนผสมที่ชนะ นี่คือสิ่งที่ฉันพบในระหว่างกระบวนการ


5
นี่เป็นคำตอบที่ถูกต้อง default_timezone ยอมรับเฉพาะ: local หรือ: utc
Francesco Belladonna

20

ในกรณีของฉัน (Rails 5) ฉันลงเอยด้วยการเพิ่ม 2 บรรทัดนี้ใน app/config/environments/development.rb

config.time_zone = "Melbourne"
config.active_record.default_timezone = :local

แค่นั้นแหละ! และเพื่อให้แน่ใจว่าเมลเบิร์นอ่านถูกต้องฉันรันคำสั่งในเทอร์มินัลของฉัน:

bundle exec rake time:zones:all

และเมลเบิร์นก็เข้ามาในช่วงเวลาที่ฉันอยู่!


ถ้าฉันต้องการให้ผู้ใช้ทุกคนเห็นค่าวันที่ในเขตเวลาของตนเอง
alexventuraio

@AlexVentura เมื่อคุณแสดงค่าวันที่ให้กับผู้ใช้ของคุณแปลงเป็นเขตเวลา ทำบันทึกฐานข้อมูลแบบถาวรเป็นวิธีที่ดีกว่า
ฮีด

10

หากคุณต้องการตั้งค่าเขตเวลาเป็น UTC ทั่วโลกคุณสามารถทำสิ่งต่อไปนี้ใน Rails 4:

# Inside config/application.rb
config.time_zone = "UTC"
config.active_record.default_timezone = :utc

โปรดรีสตาร์ทแอปพลิเคชันของคุณไม่เช่นนั้นคุณจะไม่เห็นการเปลี่ยนแปลง


3

บนราง 4.2.2 ไปที่application.rbและใช้config.time_zone='city'(เช่น: 'ลอนดอน' หรือ 'บูคาเรสต์' หรือ 'อัมสเตอร์ดัม' เป็นต้น)

มันควรจะทำงานได้ดี มันใช้งานได้สำหรับฉัน


3

ฉันต้องเพิ่มบล็อกนี้ไปยังenvironment.rbไฟล์ของฉันและทั้งหมดก็ดี :)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • ฉันเพิ่มก่อนบรรทัดRails.application.initialize!

1

สำหรับผู้ใช้ภาษาจีนเพียงเพิ่มสองบรรทัดด้านล่างให้กับคุณconfig/application.rb:

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'

0

ใน Ruby on Rails 6.0.1 ไปที่config > locales > application.rb y agrega lo siguiente:

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module CrudRubyOnRails6
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    config.active_record.default_timezone = :local
    config.time_zone = 'Lima'

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

คุณจะเห็นว่าฉันกำลังกำหนดค่าเขตเวลาด้วย 2 บรรทัด:

config.active_record.default_timezone =: local
config.time_zone = 'Lima'

ฉันหวังว่าจะช่วยผู้ที่ทำงานกับ Ruby on Rails 6.0.1


-2

หากคุณต้องการตั้งเวลาท้องถิ่นให้เพิ่มข้อความต่อไปนี้ใน application.rb

config.time_zone = 'Chennai'

# WARNING: This changes the way times are stored in the database (not recommended)
config.active_record.default_timezone = :local

จากนั้นรีสตาร์ทเซิร์ฟเวอร์ของคุณ


12
default_timezone ยอมรับหนึ่งในสองตัวเลือก .. : local หรือ: utc .. ไม่ยอมรับเขตเวลาที่เฉพาะเจาะจงดังนั้นสิ่งนี้จะไม่ทำงาน .. คุณต้องตั้งค่า default_timezone เป็น: local
Urkle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.