ตัวช่วยแบบฟอร์ม time_select ตีความวัตถุเวลาใหม่เป็น UTC ไม่ใช่เขตเวลาที่กำหนดค่า

ฉันพบปัญหาที่ดูเหมือนเป็นเรื่องง่ายสำหรับฉัน แต่ฉันไม่สามารถเข้าใจได้ว่าฉันทำอะไรผิด ในแอปของฉัน ผู้ใช้สามารถเพิ่มหลักสูตรของตนผ่าน form_for แบบง่ายๆ พวกเขาสามารถป้อน start_time และ end_time สำหรับการบรรยายของหลักสูตรได้ เช่น:

<div class="field">
  Start Time<br />
  <%= time_select :course, :start_time, { :minute_step => 5, :ampm => true } %>
</div>

<div class="field">
  End Time<br />
  <%= time_select :course, :end_time, { :minute_step => 5, :ampm => true } %>
</div>

ฉันกำหนดค่าเขตเวลาใน application.rb ให้ตั้งค่าเป็นเวลาตะวันออก และดูเหมือนว่าจะทำงานได้อย่างถูกต้องเมื่อ create_at ถูกส่งกลับในเขตเวลาที่ถูกต้อง

อย่างไรก็ตาม ปัญหาที่ฉันพบคือป้อน start_time และ end_time เป็น UTC ลงในฐานข้อมูล ดังนั้นเมื่อผู้ใช้เลือกชั้นเรียนที่จะเริ่มเวลา 10.00 น. ชั้นเรียนจะถูกป้อนเป็น 10 UTC ไม่ใช่ 10.00 น. EST / 15:00 UTC ฉันพลาดอะไรไปที่นี่? ดูเหมือนว่าสิ่งที่ฉันต้องการให้เกิดขึ้นควรจะเป็นไปได้


person Philip V    schedule 05.01.2012    source แหล่งที่มา
comment
บางทีนี่อาจช่วยคุณได้: stackoverflow.com/questions/4362663/timezone-with-rails-3   -  person Tim Brandes    schedule 05.01.2012
comment
จริงๆ แล้วฉันคิดว่าฉันมีปัญหาตรงกันข้าม start_time และ end_time ของฉันไม่ได้รับการบันทึกภายในเขตเวลา แต่บันทึกเป็นเวลา UTC   -  person Philip V    schedule 05.01.2012
comment
ฉันไม่เคยใช้ time_select แต่จะ datetime_select เสมอเมื่อต้องจัดการกับเขตเวลา บางทีนี่อาจเป็นปัญหา แต่ดูเหมือนว่าจะไม่น่าเป็นไปได้   -  person Tim Brandes    schedule 05.01.2012
comment
ความคิดของคุณทำให้ฉันมาถูกทางแล้ว ฉันเปลี่ยนประเภทคอลัมน์สำหรับ start_time และ end_time เป็น datetime และนี่เป็นการแก้ไขปัญหาที่ฉันมี ฉันเดาว่าคอลัมน์เวลาอนุญาตเฉพาะ UTC เท่านั้น   -  person Philip V    schedule 05.01.2012
comment
@TimBrandes หรือ PhilipV - หากคุณเล่นเกมที่จะสรุปวิธีแก้ปัญหาเป็นคำตอบของคุณเอง ฉันจะลบคำตอบของฉัน (ดู meta.stackexchange.com/questions/90263 / เพื่ออธิบายอย่างละเอียดว่าเหตุใดจึงมีประโยชน์) ขอบคุณ!   -  person DreadPirateShawn    schedule 09.10.2013


คำตอบ (2)


สรุปคำตอบจากความคิดเห็นเพื่อลบคำถามนี้ออกจากตัวกรอง "ยังไม่ได้ตอบ":

แนะนำโดย Tim Brandes:

บางทีนี่อาจช่วยคุณได้: เขตเวลาที่มีราง 3 ... ฉันไม่เคยใช้ time_select แต่มักจะ datetime_select เมื่อจัดการกับเขตเวลา บางทีนี่อาจเป็นปัญหา แต่ดูเหมือนว่าจะไม่น่าเป็นไปได้

โซลูชันที่เหมาะกับ Philip V:

start_time และ end_time ของฉันไม่ได้รับการบันทึกภายในเขตเวลา แต่บันทึกเป็นเวลา UTC ... ฉันเปลี่ยนประเภทคอลัมน์สำหรับ start_time และ end_time เป็น datetime และนี่เป็นการแก้ไขปัญหาที่ฉันมี ฉันเดาว่าคอลัมน์เวลาอนุญาตเฉพาะ UTC เท่านั้น

person DreadPirateShawn    schedule 09.10.2013

ฉันกำลังดิ้นรนกับปัญหาเดียวกัน แต่แล้วฉันก็รู้ว่าฉันไม่ต้องการข้อมูลเขตเวลาของวัตถุ Time

อย่างที่คุณพูด ฐานข้อมูลจะจัดเก็บเป็น UTC แต่สิ่งสำคัญจริงๆ ที่เราต้องทำกับข้อมูลนี้คือ:

course.start_time.hour
course.start_time.min

นี่คือเขตเวลาที่ไม่ขึ้นอยู่กับเวลา (8 ชั่วโมงคือ 8 ชั่วโมงนับจากเที่ยงคืน ไม่ว่าคุณจะเปรียบเทียบเที่ยงคืนใดก็ตาม 30 นาทีคือ 30 นาทีจากนาทีที่ 0 ของชั่วโมง ไม่ว่าคุณจะใช้ชั่วโมงนั้นในเขตเวลาใดก็ตาม)

ดังนั้นในแอปพลิเคชันส่วนใหญ่ที่จำเป็นต้องมีโครงสร้างการจัดเก็บเวลา เช่น ต้องการทราบว่า เหตุการณ์ที่เกิดซ้ำ เริ่มต้นหรือสิ้นสุดเมื่อใด เพื่อจัดเก็บค่าของตัวจับเวลา หรือเวลาของรอบใน การแข่งขัน คุณสามารถใช้เวลา UTC ที่ฐานข้อมูลส่งคืนได้โดยไม่มีปัญหา

person João Paulo Motta    schedule 20.05.2015