6 เรื่องที่ควรรู้ เกี่ยวกับการใช้ DateTime ใน ภาษา C# ที่โปรแกรมเมอร์มือใหม่มักมองข้าม !

ทิป & เทคนิค #191
เขียนโดย :
มีผู้อ่าน : 25,318 คน วันนี้ : 6 คน


สำหรับโปรแกรมเมอร์มือใหม่ ในหลายๆ ครั้งมักเจอปัญหาเกี่ยวกับการใช้ข้อมูลที่เป็น วันที่และเวลา (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 เป็นอีกวิธีที่ยืดหยุ่นโดยไม่ต้องกังวลเรื่องเวลาที่แต่ละเครื่องตั้งค่าไม่ตรงกัน ที่อาจส่งผลให้ข้อมูลเก็บผิดพลาดได้ ส่วนขั้นตอนการแสดงผลค่อยนำค่าที่เก็บมาแสดงตามเวลาของเครื่องนั้นๆ แทนครับ

           

          Tag : ASP.NET , C#.NET