แสดงเวลาให้ตรงกับ 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) ได้เลย