เรื่องของ Timezone 🕙🕚🕔 — ตอนต้น

mixth
Zarewoft
Published in
2 min readSep 25, 2018

เคยเจอปัญหาตอนเราพัฒนาของชิ้นนึงแล้วใช้งาน Timezone ติดๆขัดๆไหมครับ? ไม่ว่าจะเป็น

  • จะเปลี่ยนค่าเวลาอย่างไรดี
  • สิ่งไหนบ้างควรจะเก็บเข้าระบบ เก็บแบบไหนดี
  • ถ้าเราจะ fixed เวลาละ จะเป็นยังไง

บทความนี้ (และตอนถัดไป) จะอธิบายถึงหลักการคร่าวๆของ timezone และการใช้ในสถานการณ์ต่างๆ ว่าเราควรจะใช้อย่างไรให้ถูกวิธีครับ

เกริ่นนำ

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

ทุกวันนี้เวลาเราจะอ้างอิงเวลาใดๆ เราจะอ้างอิงจาก UTC — Universal Time Coordinated ซึ่งเป็นมาตรฐานเวลาที่เริ่มใช้มาตั้งแต่วันที่ 1 มกราคม 1960 โดยแต่ละ Timezone จะมีชื่อของแต่ละ Timezone และกำหนดว่าห่างจาก UTC เป็นค่า +/- เท่าใดครับ

ยกตัวอย่างเช่น

ประเทศไทยใช้ Timezone ชื่อ ICT — Indochina Time ซึ่งมีความห่างอยู่ที่ +7 หรือเขียนว่า UTC+7 ครับ

ทุกๆครั้งที่ทำงานเกี่ยวกับเวลา เรามักจะมีเรื่องปวดหัวเสมอๆเลยใช่ไหมครับ วันนี้เรามาทำให้มันกระจ่างกันดีกว่าเนอะ

จุดนึงในเวลา

ไม่ว่าเราจะอยู่ที่ไหนของโลก ในขณะเดียวกันเราจะมีเวลาที่ UTC เท่ากัน

ประโยคข้างต้นสำหรับบางคนอาจจะเข้าใจอยู่แล้ว แต่บางคนอาจจะอ่านแล้วงงๆหน่อย ขยายความออกมาก็คือ ถ้า Alice อยู่ที่อังกฤษตอนนี้ Bob อยู่ที่ไทยตอนนี้เช่นกัน ถ้าทั้งสองคนดูเวลาที่ UTC จะเห็นนาฬิกาบอกเวลาเท่ากันครับ

ผมอยากเรียกสิ่งนี้ว่า จุดนึงในเวลา ครับ

แม้ว่าเราจะมีอยู่ในจุดนึงในเวลาเดียวกัน แต่ว่าเนื่องจากว่า Alice อยู่ที่อังกฤษซึ่งช่วงนี้จะใช้ Timezone ชื่อ Britain Summer Time (BST) ซึ่งเทียบกับ UTC แล้วคือ UTC+1 ส่วน Bob อยู่ที่ไทยใช้ ICT คือ UTC+7 ทำให้ทั้งสองมีเวลาท้องถิ่นแตกต่างกัน

ถ้าตอนนี้ที่ UTC เวลา 10 โมงเช้า Alice จะเห็นนาฬิกาที่อังกฤษเป็นเวลา 11:00 ส่วน Bob จะเห็นนาฬิกาที่ไทยเป็นเวลา 17:00 แต่ทั้งสองคนต่างพูดถึงจุดนึงในเวลาเดียวกันเนอะ

เพราะฉะนั้น การที่เราเขียนว่า “1 มกราคม 2562 เวลา 8 นาฬิกาตรง” หากเราไม่มี context อื่นเพื่อมาอธิบายว่าเวลาที่กล่าวถึงอยู่ใน timezone ใด เราจะไม่สามารถระบุจุดนึงในเวลาได้เลย เพราะเราไม่รู้ว่าจะตีความเวลานั้นอย่างไรครับ

การเก็บเวลาในคอมพิวเตอร์ก็เช่นกันครับ หากเราต้องการเก็บเพื่อระบุจุดนึงในเวลา เราจำเป็นที่ต้องเก็บ timezone หรือใน application เราก็ต้องตีความเวลาที่เห็นนั้น เป็น timezone นึงเสมอ

ISO 8601

คือมาตรฐานในการแสดงวันและเวลา เรียงจากค่าของหน่วยที่มีค่ามากกว่าไปถึงน้อยกว่าครับ โดยทั่วไปเรามักจะเคยเห็นลักษณะหน้าตาประมาณนี้

YYYY-MM-DDThh:mm:ss±hh:mm

ลองให้ Alice กับ Bob ใช้ ISO ในการบอกเวลาท้องถิ่นของตัวเองดูก็จะได้แบบนี้

โดย Z ที่เห็นใน string เป็นการบอกว่าเป็นเวลาที่ UTC ครับ

หากเราลองดู format ข้างต้น เราจะเห็นว่ามันสามารถบอกจุดนึงในเวลาได้ นอกจากนี้ string อาจจะบอกเราได้ด้วยว่าเวลาดังกล่าวอยู่ใน timezone ใดครับ

สรุป

  • จุดนึงในเวลาอาจจะมีเวลาท้องถิ่นแตกต่างกันตามเมือง/ประเทศ
  • หากไม่มั่นใจว่าหมายถึงจุดเดียวกันไหม ให้ลองปรับเวลาเป็น UTC เพื่อเปรียบเทียบกัน
  • ISO datetime with timezone สามารถ represent ได้สองอย่าง จุดนึงในเวลา และ timezone

ในตอนหน้าเราจะมาลองอธิบายการนำ timezone ไปประยุกต์ใช้งานกับการทำงานของโปรแกรมกัน ว่าเราจะใช้อะไรเมื่อไรอย่างไรครับ

แนะนำ ติชมได้เต็มที่เลยนะครับ หากมีคำถามเพิ่มเติมหรืออยากให้เขียนเรื่องไหนก็บอกกันได้เลยครับ :)

Extra

  • ประเทศนึงหรือภูมิภาคนึงไม่ได้จำเป็นต้องอยู่ใน timezone เดิมตลอดเวลานะครับ ยกตัวอย่างเช่นอังกฤษที่ Alice อยู่ จะมีการปรับ timezone ไป-มาปีละ 2 ครั้งระหว่าง GMT — Greenwich mean time กับ BST — British Summer Time เพราะสิ่งที่เรียกว่า Daylight saving time ครับ

Female User and User Male icons are licensed under Creative Commons Attribution-NoDerivs 3.0 Unported by Icons8

Cover Photo adapted from a picture of Phil Desforges on Unsplash

--

--

mixth
Zarewoft

🇹🇭 BKK based 👨‍💻 software engineer 🐈 love cats 🌟 push for more democratic and more transparent gov 🍿 watch way too much movies and tv series