แสดงเวลาให้ตรงกับ timezone อย่างไร
Time.now
เมื่อถูกเรียกใช้งานจะดึงเวลาปัจจุบันจากเครื่องที่มาอ้างอิง ซึ่งถ้าเป็นสถานะการที่ควบคุมได้อย่างเช่น เครื่องคอมพิวเตอร์ของเรา หรือ VM ที่เราเข้าไปจัดการ timezone ได้ ส่วนใหญ่ก็จะไม่เจอปัญหาที่ว่า เวลาที่ใช้แสดงบนหน้าเว็บกับเวลาที่บันทึกจริงไม่ตรงกัน
เราบันทึกข้อมูลเวลา 10 โมงเช้าประเทศไทย แต่เมื่อบันทึกข้อมูลเสร็จ เข้าไปดูในหน้ารายละเอียด กลับพบว่าเวลาที่บันทึกกลายเป็น 3 โมงเช้าซะงั้น
ทั้งนี้ก็เนื่องมาจาก timezone ที่ในเครื่องใช้ UTC เท่ากับ +0 อยู่แทนที่จะเป็น +7 พอเป็นแบบนี้ส่งผลให้เวลาที่บันทึกอยู่ในฐานข้อมูลก็ผิดไปด้วย ดังนั้นการนำข้อมูลกลับออกมาแสดงจะต้องทำการแปลงเวลาใหม่ให้อยู่ใน timezone ที่ถูกต้องก่อนผ่าน in_time_zone
def current_date_format_in_timezone(datetime, timzone = "Asia/Bangkok")
datetime.in_time_zone(timzone).strftime("%d/%m/%Y %H:%M:%S")
end
โดย Rails จะกำหนดค่ามาตรฐานของ time_zone
ที่จะใช้งานได้ใน config/application.rb
# config/application.rb
...
config.time_zone = "Asia/Bangkok"
และสามารถดึงค่า timezone ที่กำหนดผ่าน Time.zone (ActiveSupport::TimeZone)
ได้เลย