รูปแบบวันที่ ที่ต้องจำ เป็นครั้งสุดท้าย (ISO 8601)

Trust Tanapruk
Nextzy
Published in
2 min readApr 21, 2018
ปี-เดือน-วัน

ในฐานะผู้ใช้งานอุปกรณ์ IT ทุกครั้งที่ได้มือถือเครื่องใหม่ ใช้โปรแกรมใหม่ มักจะต้องงงกับวันที่ เช่น

confusing date

ผมไม่รู้ว่าวันที่ข้างบนเป็น วันที่ 6 เดือนเมษายน หรือ เป็นวันที่ 4 เดือน มิถุนายน ซึ่ง ผมต้องไปเทียบกับไฟล์อื่นที่ใช้วันที่เกินวันที่ 12 ไป เพื่อยืนยันว่าเครื่องนี้เป็น เดือน วัน ปี หรือ วัน เดือน ปี

Verbose date

อีกวิธีที่ผมทำประจำคือไปเปลี่ยนวันที่ของเครื่องให้แสดงเดือนเป็นตัวหนังสือไปเลย

วันที่ ในมุมมอง developer

เมื่อเป็น user ผมก็คิดว่าเป็นความต่างของระบบ ก็แก้ไขปัญหาเฉพาะหน้าเท่าที่ทำได้ เคยคิดว่าแต่ละภาษา แต่ละโปรแกรม ก็น่าจะมีมาตรฐานกลางสิ เปล่าเลย

บางโปรแกรมเก็บข้อมูลเป็นตัวเลขยาวๆ 1524290397 ซึ่ง คือจำนวนวินาที ตั้งแต่วันที่ 1 มค 1970 UTC

บางโปรแกรมก็เก็บข้อมูลเป็น 21/04/2018 ปีแค่สองหลัก 21/04/18 เปลี่ยนตัวขั้นเวลา 21-04-2018 ปีเป็น พศ 21/04/2561

ซึ่งก็ไม่ได้มีปัญหาหรอก เพราะเรามีเครื่องมือสำหรับ parse ตัวหนังสือพวกนี้ให้กลายเป็น Date หรือ Calendar ในรูปแบบที่เราสามารถหักลบ วันที่ได้

แต่…

ถ้า user ที่ใช้ระบบเรา เปลี่ยน timezone ในเครื่องล่ะ เช่น จากเดิมอยู่ไทย และไปเที่ยวสหรัฐ อเมริกา

1524290397 หน่วยนี้ไม่มีปัญหา เพราะระบุไว้แล้วว่าเป็น เวลาของ UTC

ถ้าเราเก็บเป็น 21/04/2018 อันนี้ไว้แค่นี้ โปรแกรมเรามีปัญหาแน่นอน เราไม่รู้ว่าเป็นวันที่ของ timezone ไหน

https://xkcd.com/1179/

มาตรฐานวันที่ระดับโลก ISO 8601

ปัญหา pattern วันที่ที่แตกต่างกัน หรือ timezone ที่สับสน จะหมดไปเพียงแค่เราเก็บวันที่ในรูปแบบมาตรฐาน ซึ่งไม่ใช่มาตรฐานของไทย ไม่ใช่มาตรฐานของสหรัฐฯ แต่เป็นมาตรฐานโลก ISO 8601 ใช้เหมือนกันทั่วโลก

Basic Date

ISO 8601 บอกว่าให้เขียนวันที่เป็น

2018-04-21

หรือ ปี เดือน วัน ขั้นด้วย - ห้ามใช้ / ทีนี้เราก็ไม่ต้องสับสนระหว่างตำแหน่งของ วัน และ เดือนแล้ว บังคับให้จัดลำดับเลย

สำหรับ developer ที่ต้องการเก็บละเอียดถึงเวลา

Date with Time

2018–04–21T13:26:22

ต่อหลัง ปีเดือนวัน ด้วย T และชั่วโมง นาที วินาที ขั้นกลางด้วย :

Date Time with Time Zone

หากต้องการระบุรายละเอียดเรื่อง Time Zone ให้ต่อท้ายด้วย

2018–04–21T13:26:22+07:00

+07:00 เป็นการระบุ time zone ว่า +07:00 จาก GMT/UTC

2018–04–21T06:26:22Z

หรือถ้าจะเก็บเป็นเวลา GMT/UTC ไปเลย ให้ลงท้ายด้วย Z

2018–04–21T06:26:22Z

2018–04–21T13:26:22+07:00

2 ค่านี้คือเวลาเดียวกัน

อื่นๆ

นอกจากนี้มาตรฐานยังระบุถึงรูปแบบอื่นๆ

เช่น ไม่ต้องระบุ - หรือ : ก็ยังโอเคนะ

20180421T062622Z

แค่เรียงลำดับให้ถูกต้อง และต้องมีตัวอักษรอย่าง T และ Z ระบุ ศึกษาเพิ่มเติมได้ที่

ในฐานะ developer การใช้ ISO 8601 เป็นมาตรฐาน โค้ดบั้คน้อยลงแน่นอน เพราะมั่นใจได้ว่า เมื่อวันที่ถูกแพทเทิน การคำนวณเวลาจะแม่นยำ และในฐานะ user การสื่อสารวันที่ก็คงไม่คลาดเคลื่อนเช่นกัน

--

--