เวลาที่เขียนโปรแกรมหลายโปรแกรม จะมีสิ่งหนึ่งที่เราเรียกใช้กันอยู่บ่อย ๆ นั่นก็คือการแสดงเวลาปัจจุบันในขณะนั้น สำหรับคนที่เขียนด้วยภาษาไพทอน คำสั่งการแสดงว่าปัจจุบันจะอยู่ในไลบรารี datetime ที่ติดมากับภาษาไพทอนเลย ไม่ต้องติดตั้งเพิ่ม อย่างไรก็ดีเวลาที่แสดงจะไม่ตรงกับที่เราอยู่ เราจำเป็นต้องตั้งค่า Time zone ให้เรียบร้อยที่จะใช้ฟังก์ชันในไลบรารี datetime
แต่ก่อนที่จะไปถึงจุดนั้น เราจะมาแนะนำไลบรารี datetime ที่จะให้เราแสดงเวลาในปัจจุบันแบบที่ไม่ตรงกับ Time zone ที่เราอยู่ก่อน
การใช้งานไลบรารี datetime
การเรียกใช้งานไลบรารีให้แสดงเวลาปัจจุบันทำได้โดยพิมพ์คำสั่งตามภาพด้านล่างนี้ครับ
อธิบายตามภาพก่อนครับ
datetime.now()
คำสั่งนี้มีหน้าที่อะไร? คำสั่งนี้มีหน้าที่แสดงวันและเวลาในขณะนั้นเองว่าเป็นวันที่เท่าไร และเวลากี่โมง กี่นาที กี่วินาที แล้ว คำสั่งนี้รูปแบบที่เราเรียกใช้งานได้โดย
หลังจากพิมพ์คำสั่งตามข้างบนนี้ ตัวคำสั่งจะคืนค่าวัน และเวลาที่อยู่ในปัจจุบัน โดยเราสามารถใช้คำสั่ง print เพื่อให้แสดงเวลาในรูปแบบที่คนอ่านแล้วเข้าใจได้ครับ [1]
strfttime()
กรณีที่เราต้องการกำหนดเองว่าจะให้แสดงผลอย่างไร เราสามารถทำได้โดยพิมพ์คำสั่ง strfttime นี้ตามภาพด้านล่าง
เมื่อเราพิมพ์คำสั่งนี้แล้ว ตัวคำสั่งจะคืนค่าเป็น string ในรูปแบบที่คนอ่านแล้วเข้าใจได้ดีกว่าเดิมครับ ส่วนตัว % ที่อยู่ในคำสั่งนั่นคืออะไรล่ะ? ตัวนี้ทำให้เรานึกถึงภาษาซีครับ ตัว % จะกำหนดว่าสิ่งที่เราต้องการให้แสดงนั่นคืออะไร เราสามารถสรุปได้ตามด้านล่างนี้ครับ
สัญลักษณ์ | ความหมาย | ตัวอย่าง |
%a | 3 ตัวอักษรแรกของคำของวันในสัปดาห์ | Sun, Mon, … |
%A | วันของสัปดาห์ในรูปแบบเต็ม ๆ | Sunday, Monday, … |
%w | วันของสัปดาห์ที่แสดงในรูปแบบตัวเลขตั้งแต่ 0 คือวันอาทิตย์ จนถึง 6 คือวันเสาร์ | 0, 1, …, 6 |
%d | วันที่ของเดือน แสดงในรูปเลขสองหลัก (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า) | 01, 02, …, 31 |
%-d | วันที่ของเดือน | 1, 2, …, 30 |
%b | 3 ตัวอักษรแรกของเดือน | Jan, Feb, …, Dec |
%B | ชื่อเดือนแบบเต็ม ๆ | January, February, … |
%m | เดือนที่แสดงอยู่ในรูปเลขสองหลัก (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า) | 01, 02, …, 12 |
%-m | เดือน | 1, 2, …, 12 |
%y | ปีที่แสดงอยู่ในรูปเลขสองหลัก (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า และในที่นี้แสดงเป็นปีศริสต์ศักราช) | 00, 01, …, 99 |
%-y | ปีที่แสดงอยู่ในรูปเลขสองหลัก ตั้งแต่ 0 – 99 (ในที่นี้แสดงเป็นปีศริสต์ศักราช) | 0, 1, …, 99 |
%Y | ปีแบบเต็ม ๆ (ในที่นี้แสดงเป็นปีศริสต์ศักราช) | 2013, 2019 etc. |
%H | เวลาที่แสดงอยู่ในรูปเลขสองหลักตั้งแต่ 0 – 23 นาฬิกา (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า) | 00, 01, …, 23 |
%-H | เวลาตั้งแต่ 0 – 23 นาฬิกา | 0, 1, …, 23 |
%I | เวลาที่แสดงอยู่ในรูปเลขสองหลัก ตั้งแต่ 0 – 12 นาฬิกา (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า) ตัวนี้จำเป็นต้องระบุว่าเป็น AM หรือ PM | 01, 02, …, 12 |
%-I | เวลาตั้งแต่ 1 – 12 นาฬิกา | 1, 2, … 12 |
%p | AM หรือ PM | AM, PM |
%M | นาทีที่แสดงอยู่ในรูปเลขสองหลักตั้งแต่ 0 – 59 นาที (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า) | 00, 01, …, 59 |
%-M | นาทีตั้งแต่ 0-59 นาที | 0, 1, …, 59 |
%S | วินาทีที่แสดงอยู่ในรูปเลขสองหลักตั้งแต่ 0 – 59 วินาที (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า) | 00, 01, …, 59 |
%-S | วินาทีตั้งแต่ 0 – 59 วินาที | 0, 1, …, 59 |
%f | ไมโครวินาที ที่แสดงอยู่ในรูปเลขหกหลัก กรณีที่เลขน้อยกว่า 6 หลัก ตัวนี้จะเติม 0 ข้างหน้าให้ครบ 6 หลัก | 000000 – 999999 |
%z | ความแตกต่างระหว่างเวลาใน Time zone นั้น ๆ กับเวลาตาม UTC โดยจะแสดงเป็น +HHMM หรือ -HHMM. | |
%Z | ชื่อเขตเวลา (Time zone) | |
%j | วันที่ของปีในรูปแบบเลข 3 หลัก กรณีที่เลขน้อยกว่าสามหลัก ตัวนี้จะเติม 0 ข้างหน้าให้ครบ | 001, 002, …, 366 |
%-j | วันที่ของปี | 1, 2, …, 366 |
%U | สัปดาห์ที่ของปี สัปดาห์แรกหลังปีใหม่จะเริ่มที่ 0 และวันแรกของสัปดาห์คือวันอาทิตย์ | 00, 01, …, 53 |
%W | สัปดาห์ที่ของปี สัปดาห์แรกหลังปีใหม่จะเริ่มที่ 0 และวันแรกของสัปดาห์คือวันจันทร์ | 00, 01, …, 53 |
%c | เวลาและวันที่ที่แสดงในรูปที่เข้ากันได้กับแต่ละเมือง/ประเทศ (Locale) | Mon Sep 30 07:06:05 2013 |
%x | วันที่ที่แสดงในรูปที่เข้ากันได้กับแต่ละเมือง/ประเทศ (Locale) | 09/30/13 |
%X | เวลาที่แสดงในรูปที่เข้ากันได้กับแต่ละเมือง/ประเทศ (Locale) | 07:06:05 |
%% | สัญลักษณ์ % | % |
ตารางการตั้งค่าฟอร์แมตของฟังก์ชัน strfttime [2]
จากที่เราสังเกตในตารางข้างบนนี้ เมื่อเราเอาไปใช้กับรูปตัวอย่างโค้ดด้านบน โค้ดด้านบนกำหนดให้แสดงเวลา และวันที่ในรูปแบบ
- วัน และเดือนที่แสดงอยู่ในรูปแบบเลขสองหลัก กรณีที่เลขน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า
- ปีคริสต์ศักราช
- ชั่วโมง นาที และวินาทีที่แสดงอยู่ในรูปแบบสองหลัก กรณีที่เลขน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า โดยตัวชั่วโมงจะแสดงตั้งแต่ 0 – 23 นาฬิกา
ตัวอย่างเช่น เราต้องการแสดงเวลา 23:24 ของวันที่ 8/9/2564 เมื่อเราพิมพ์ตัวสัญลักษณ์ลงในวงเล็บของ strfttime เราสามารถแสดงวันและเวลาได้เป็น 08/09/2021 23:24 ครับ [2]
อย่างไรก็ดี เมื่อเราใช้คำสั่งตามด้านบนนี้ เวลาที่แสดงจะไม่ตรงกันกับเวลาจริงตาม Time zone ดังนั้นแล้ว เราจำเป็นต้องตั้งค่า Time zone ให้ตรงกับสถานที่ที่เราต้องการ
การตั้งค่า Time zone
การตั้งค่า Time zone ของสถานที่นั้น ๆ เพื่อให้ฟังก์ชันแสดงเวลาตรงกับสถานที่ที่เราอยู่ครับ เราสามารถตั้งค่าได้โดย
ใช้ไลบรารี time
ไลบรารีนี้เป็นไลบรารีที่มีอยู่แล้วในไพทอน เราสามารถตั้งค่าให้แสดงวันและเวลาตาม Time zone นั้น ๆ ได้โดยพิมพ์โค้ดตามด้านล่างนี้ครับ
จากโค้ดที่ปรากฏด้านบน เราสามารถเปลี่ยน Time zone ได้โดยการตั้งค่าที่ os.environ[‘TZ’] แล้วพิมพ์ Time zone ตามที่เราต้องการ ในตัวอย่างจะใช้ Asia/Bangkok ครับ [3]
เทคนิคนี้มีข้อด้อยอย่างนึงก็คือการตั้งค่า Time zone เราจำเป็นต้องไปยุ่งกับ Environment Variable ซึ่งจะส่งผลต่อการใช้งานในฟังก์ชัน หรือในโปรแกรมอื่นด้วย และการตั้งค่าเรื่องเวลามันจะมี Daylight saving หรืออื่น ๆ ฟังดูยุ่งยากไปหน่อย วิธีนี้เราไม่ค่อยแนะนำ
เราแนะนำอีกวิธีครับ
ใช้ไลบรารี pytz
ไลบรารี pytz เป็นไลบรารีที่อนุญาตให้เราปรับ Time zone ได้ตามสะดวก ร่วมกันกับแก้ปัญหาเรื่อง Daylight saving ด้วย ทำให้ผู้ใช้สามารถใช้งานฟังก์ชันได้สะดวกมากกว่าเดิม [3] อย่างไรก็ดี ก่อนที่จะเริ่มใช้งาน เราจำเป็นต้องติดตั้งฟังก์ชันนี้ก่อน ทำได้โดยพิมพ์คำสั่ง
กดปุ่ม Enter แล้ว เรารอไพทอนติดตั้งไลบรารีให้ เมื่อติดตั้งเสร็จแล้ว เราสามารถปรับ Time zone โดยการใช้ไลบรารีได้ โดยพิมพ์ตามด้านล่างนี้ครับ
ตัวฟังก์ชัน timezone จะตั้งค่าตามเวลากรุงเทพฯ ให้เรา หลังจากนั้น เราใช้คำสั่ง datetime.now(timezone) เพื่อแสดงเวลาปัจจุบันตามเวลาของกรุงเทพฯ เอง ซึ่งเวลาตรงตามเวลาที่ที่ผู้เขียนเขียนอยู่
สำหรับผู้ใช้ที่ต้องการแสดงเวลาตาม Time zone ที่อื่น เราสามารถเปลี่ยนตรง Asia/Bangkok เป็นที่อื่นได้ครับผม [4]
สรุป
การใช้งานฟังก์ชัน datetime.now() จะแสดงว่าที่ไม่ขึ้นกับ Time zone ปัจจุบันที่เราอยู่ ดังนั้นแล้วกรณีที่ต้องการแสดงเวลาปัจจุบันตามสถานที่ที่เราอยู่ เราจำเป็นต้องตั้งค่า Time zone ก่อน ซึ่งสามารถตั้งค่าได้ง่ายโดยใช้ไลบรารี pytz ครับ
แหล่งอ้างอิง
[1] datetime — Basic date and time types — Python 3.9.7 documentation [Internet]. Docs.python.org. 2021 [cited 8 September 2021]. Available from: https://docs.python.org/3/library/datetime.html#module-datetime
[2] Python strftime() – datetime to string [Internet]. Programiz.com. 2021 [cited 8 September 2021]. Available from: https://www.programiz.com/python-programming/datetime/strftime
[3] time — Time access and conversions — Python 3.9.7 documentation [Internet]. Docs.python.org. 2021 [cited 8 September 2021]. Available from: https://docs.python.org/3/library/time.html#time.strftime
[4] Working With TimeZones in Python [Internet]. Pynative Python Programming. 2021 [cited 8 September 2021]. Available from: https://pynative.com/python-timezone/