PlusMagi's Blog By Pitt Phunsanit Backend UTC (Coordinated Universal Time) หรือเวลาสากลเชิงพิกัด

UTC (Coordinated Universal Time) หรือเวลาสากลเชิงพิกัด

ทำความเข้าใจ UTC: มาตรฐานเวลาสากลในระบบฐานข้อมูล

ในโลกของการพัฒนาซอฟต์แวร์ขนาดใหญ่ (Enterprise Systems) และระบบเครือข่ายข้อมูลที่ต้องมีการสื่อสารข้ามเขตเวลา (Cross-Time Zone Communication) การใช้เวลาท้องถิ่น (Local Time) เป็นเรื่องที่อันตรายอย่างยิ่ง เพราะมันผูกติดกับเขตเวลา (Time Zone) การเปลี่ยนแปลงของ Daylight Saving Time (DST) หรือแม้แต่การเปลี่ยนเขตการปกครองเพียงเล็กน้อย ก็อาจทำให้ข้อมูลเวลาในฐานข้อมูลผิดพลาดได้

นี่คือเหตุผลที่ Coordinated Universal Time (UTC) หรือเวลาสากลเชิงพิกัด ได้กลายเป็นมาตรฐานหลักที่นักพัฒนาและสถาปนิกระบบทุกคนต้องทำความเข้าใจ UTC ไม่ใช่แค่การเปลี่ยนชื่อจาก GMT แต่เป็นแหล่งอ้างอิงเวลาสากลที่เที่ยงตรงที่สุด ไม่ขึ้นอยู่กับตำแหน่งทางภูมิศาสตร์ใด ๆ เลย

UTC คืออะไร? หลักการทำงานสำหรับสถาปนิกระบบ

ในทางเทคนิค UTC คือการกำหนดเวลาที่อ้างอิงจากค่าเฉลี่ยของเวลาอะตอม (Atomic Time) ซึ่งเป็นระบบที่เสถียรและแม่นยำกว่าการอ้างอิงจากตำแหน่งทางภูมิศาสตร์ใด ๆ การใช้ UTC ในการจัดเก็บข้อมูลเวลา (Timestamp) ในฐานข้อมูลจึงเป็นการทำให้ข้อมูลมีความเป็นสากล (Universal) ไม่ว่าผู้ใช้จะเข้าถึงระบบจากกรุงเทพฯ ลอนดอน หรือนิวยอร์ก ข้อมูลเวลาที่จัดเก็บในฐานข้อมูลจะยังคงเป็นค่า UTC เสมอ

การจัดการเวลาใน PostgreSQL ด้วย UTC

PostgreSQL ถูกออกแบบมาให้รองรับการจัดการเขตเวลาได้อย่างยอดเยี่ยม โดยมีประเภทข้อมูลหลักที่เกี่ยวข้องคือ timestamp with time zone ซึ่งเป็นประเภทข้อมูลที่แนะนำให้ใช้เสมอเมื่อต้องจัดการเวลาที่มาจากหลายแหล่งที่มา

เมื่อคุณบันทึกข้อมูลเวลาลงในคอลัมน์ประเภท timestamp with time zone PostgreSQL จะทำการแปลงเวลาที่ได้รับให้เป็น UTC โดยอัตโนมัติก่อนจัดเก็บ ทำให้คุณมั่นใจได้ว่าข้อมูลเวลาที่ถูกเก็บไว้ในดิสก์นั้นเป็นค่ามาตรฐานสากลเสมอ

ตัวอย่างการใช้งาน PostgreSQL: การแปลงและจัดเก็บเวลา

ตัวอย่างโค้ดนี้แสดงให้เห็นว่าเมื่อเราป้อนเวลาที่ระบุเขตเวลา (เช่น เวลาในกรุงเทพฯ) เข้าไปในระบบ PostgreSQL ระบบจะทำการแปลงและจัดเก็บเป็น UTC ให้เราโดยอัตโนมัติ:

SQL

-- 1. การสร้างตารางที่ใช้ timestamp with time zone (แนะนำ) 
CREATE TABLE events (
    event_id SERIAL PRIMARY KEY,
    event_name VARCHAR(100),
    event_time TIMESTAMP WITH TIME ZONE
);

-- 2. การแทรกข้อมูลเวลาจากเขตเวลาท้องถิ่น (Asia/Bangkok) 
-- PostgreSQL จะแปลงเวลานี้เป็น UTC ก่อนจัดเก็บ 
INSERT INTO events (event_name, event_time) 
VALUES ('Meeting Start', '2024-06-20 10:00:00+07');

-- 3. การดึงข้อมูลกลับมาดูเวลาที่จัดเก็บ (จะแสดงเป็น UTC) 
SELECT event_name, event_time FROM events;

-- 4. การแสดงผลเวลาที่จัดเก็บในเขตเวลาที่ผู้ใช้ต้องการดู 
-- ใช้ AT TIME ZONE เพื่อแสดงผลให้เป็นเขตเวลาท้องถิ่น 
SELECT event_name, event_time AT TIME ZONE 'Asia/Bangkok' FROM events;

สรุป: แนวปฏิบัติที่ดีที่สุด (Best Practice)

ในฐานะ Senior Architect เมื่อต้องออกแบบระบบที่ต้องจัดการเวลา ควรยึดหลักการดังนี้:

  1. จัดเก็บ (Store): ใช้ประเภทข้อมูล timestamp with time zone และให้ PostgreSQL จัดเก็บเวลาในรูปแบบ UTC เสมอ
  2. ประมวลผล (Process): เมื่อมีการคำนวณทางเวลา (เช่น การหาความแตกต่างของเวลา) ควรใช้ค่าที่ถูกแปลงเป็น UTC ก่อน
  3. แสดงผล (Display): เมื่อถึงขั้นตอนการแสดงผลให้ผู้ใช้เห็นเท่านั้น จึงค่อยใช้ฟังก์ชันเช่น AT TIME ZONE เพื่อแปลงค่า UTC ให้เป็นเขตเวลาท้องถิ่นของผู้ใช้งาน

การปฏิบัติตามหลักการเหล่านี้จะช่วยให้ระบบของคุณมีความเสถียรทางเวลาอย่างสมบูรณ์แบบ ไม่ว่าผู้ใช้งานจะอยู่ที่ใดบนโลกใบนี้