สำหรับโปรแกรมเมอร์มือใหม่ ในหลายๆ ครั้งมักเจอปัญหาเกี่ยวกับการใช้ข้อมูลที่เป็น วันที่และเวลา (DateTime) ที่เหมือนจะดูจะเป็นเรื่องง่ายๆ แต่อาจส่งผลให้ข้อมูลผิดหรือโปรแกรมมีการทำงานผิดพลาดได้
ในบทความนี้ เราจะมาไขข้อสงสัยเกี่ยวกับ DateTime ในภาษา C# ที่จะทำให้คุณเข้าใจและสามารถนำข้อมูลที่เป็น DateTime ไปใช้ได้อย่างเหมาะสม กันครับ
1) โครงสร้างของ DateTime
ประกอบด้วย Date(วันที่), Time(เวลา) และ TimeZone(เขตเวลา) แล้วหากต้องการเก็บเฉพาะวันที่ก็ใส่เพียงวันที่เท่านั้น โดยในส่วนของเวลาจะถูกเก็บเป็น 00:00:00:000 หรือก็คือเที่ยงคืนนั่นเอง ดังตัวอย่าง
new DateTime(2016, 10, 28, 8, 50, 0); // ค่าที่เก็บ คือ วันที่ 28 เดือน 10 ปี 2016 เวลา 8 นาฬิกา 50 นาที 0 วินาที
new DateTime(2016, 10, 28); // ค่าที่เก็บ คือ วันที่ 28 เดือน 10 ปี 2016 เวลา 0 นาฬิกา 0 นาที 0 วินาที
2) TimeZone คืออะไร
TimeZone หรือ เส้นแบ่งเขตเวลาตามแต่ละพื้นที่บนโลกที่มีเวลาแตกต่างกัน เช่น เวลา 7 โมงเช้าของประเทศไทย แต่เป็นเวลาเที่ยงคืนที่ประเทศอังกฤษ ซึ่งส่งผลให้แต่ละเส้นแบ่งใช้เวลาที่แต่งต่างกัน ก็คือเวลาประเทศไทยเร็วกว่าประเทศอังกฤษ 7 ชั่วโมง (UTC+7) ซึ่งมีเวลาสากลเชิงพิกัด (Coordinated Universal Time: UTC) เป็นตัวกำหนด
3) การใช้ DateTime Type ในการเก็บข้อมูล
การออกแบบระบบสิ่งแรกๆ ที่ต้องคำนึงถึงคือชนิดของข้อมูลที่เราต้องการใช้งาน ตัวแปรประเภท DateTime ก็เช่นกัน เอาไว้เก็บข้อมูลที่เป็น “ วันที่และเวลา ” ซึ่งบางระบบจะมี DateTime ให้ใช้มากกกว่า 1 แบบ
4) การแสดงผล DateTime เป็น String
ในภาษาตระกูล .NET เราจะใช้ตัวช่วยคือ String Format เพื่อให้ผลลัพธ์ออกมาเป็นข้อความตามรูปแบบที่เราต้องการ เช่น
dd หมายถึง แสดงวันที่ 2 หลัก
MMM หมายถึง แสดงชื่อเดือนแบบย่อ
mm หมายถึง แสดงนาที 2 หลัก
ดังตัวอย่างต่อไปนี้
DateTime date1 = new DateTime(2008,8 ,29 ,19 ,27 ,15 ,18);
Console.WriteLine(date1.ToString("dd/MM/yyyy hh:mm:ss ")); //แสดงผล 29/08/2018 19:27:15
Console.WriteLine(date1.ToString("dd/MM/yyyy")); //แสดงผล 29/08/2018
Console.WriteLine(date1.ToString("hh:mm:ss tt")); //แสดงผล 19:27:15 18
Console.WriteLine(date1.ToString("hh:mm")); //แสดงผล 19:27
(Ref. https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx)
5) การใช้ CultureInfo สำหรับเปลี่ยนภาษา
ลองดูตัวอย่างต่อไปนี้
DateTime date1 = new DateTime(2008, 8, 29, 19, 27, 15);
Console.WriteLine(date1.ToString("d MMMM", CultureInfo.CreateSpecificCulture("en-US")));
// แสดงผล 29 August
Console.WriteLine(date1.ToString("d MMMM", CultureInfo.CreateSpecificCulture("th-TH")));
// แสดงผล 29 สิงหาคม
(Note : สามารถนำ Thread มาช่วยทำงานในส่วนนี้ได้)
6) การแปลง String เป็น DateTime
การที่จะแปลงเพื่อให้ได้ข้อมูลที่ถูกต้องควรที่จะระบุรูปแบบของ String ที่จะทำการแปลง โดยปกติจะมีรูปแบบมาตรฐาน ISO กำหนด (ดูรูปแบบมาตรฐานได้ที่ https://www.w3.org/TR/NOTE-datetime) และควรระบุ TimeZone หากต้องการเก็บเวลาด้วยทุกครั้งเพื่อป้องกันการลงข้อมูลของเวลาผิดพลาดที่เกิดจากการทำงานบนระบบที่แตกต่างกัน
ตัวอย่าง
CultureInfo provider = CultureInfo.InvariantCulture;
string dateString = "2016-09-10";
string format = "yyyy-MM-dd";
DateTime result = DateTime.ParseExact(dateString, format, provider);
จะเห็นได้ว่าการใช้ DateTime นั้นไม่ใช่เรื่องยาก หากเรามีความเข้าใจจะสามารถนำไปใช้ได้อย่างถูกวิธี และส่งผลให้ข้อมูลในระบบมีความถูกต้องมากที่สุด
อ้อ ! แถมอีกนิดนึงครับ ! การเก็บข้อมูลเป็น UTC+0 เป็นอีกวิธีที่ยืดหยุ่นโดยไม่ต้องกังวลเรื่องเวลาที่แต่ละเครื่องตั้งค่าไม่ตรงกัน ที่อาจส่งผลให้ข้อมูลเก็บผิดพลาดได้ ส่วนขั้นตอนการแสดงผลค่อยนำค่าที่เก็บมาแสดงตามเวลาของเครื่องนั้นๆ แทนครับ