Categories
Computer Diary

วิธีให้ไพทอนแสดงเวลาตาม Time zone

สิ่งที่เราใช้บ่อยคือการแสดงเวลาในปัจจุบัน สำหรับไพทอน การโชว์เวลาในไลบรารี datetime ให้เวลาไม่ตรงเป๊ะ

ในบทความ เราจะแนะวิธีตั้งค่าแสดงเวลาตาม Time zone

เวลาที่เขียนโปรแกรมหลายโปรแกรม จะมีสิ่งหนึ่งที่เราเรียกใช้กันอยู่บ่อย ๆ นั่นก็คือการแสดงเวลาปัจจุบันในขณะนั้น สำหรับคนที่เขียนด้วยภาษาไพทอน คำสั่งการแสดงว่าปัจจุบันจะอยู่ในไลบรารี datetime ที่ติดมากับภาษาไพทอนเลย ไม่ต้องติดตั้งเพิ่ม อย่างไรก็ดีเวลาที่แสดงจะไม่ตรงกับที่เราอยู่ เราจำเป็นต้องตั้งค่า Time zone ให้เรียบร้อยที่จะใช้ฟังก์ชันในไลบรารี datetime

แต่ก่อนที่จะไปถึงจุดนั้น เราจะมาแนะนำไลบรารี datetime ที่จะให้เราแสดงเวลาในปัจจุบันแบบที่ไม่ตรงกับ Time zone ที่เราอยู่ก่อน

การใช้งานไลบรารี datetime

การเรียกใช้งานไลบรารีให้แสดงเวลาปัจจุบันทำได้โดยพิมพ์คำสั่งตามภาพด้านล่างนี้ครับ

แสดงว่าโดยใช้ไลบรารี datetime

อธิบายตามภาพก่อนครับ

datetime.now()

คำสั่งนี้มีหน้าที่อะไร? คำสั่งนี้มีหน้าที่แสดงวันและเวลาในขณะนั้นเองว่าเป็นวันที่เท่าไร และเวลากี่โมง กี่นาที กี่วินาที แล้ว คำสั่งนี้รูปแบบที่เราเรียกใช้งานได้โดย

รูปแบบคำสั่ง datetime.now

หลังจากพิมพ์คำสั่งตามข้างบนนี้ ตัวคำสั่งจะคืนค่าวัน และเวลาที่อยู่ในปัจจุบัน โดยเราสามารถใช้คำสั่ง print เพื่อให้แสดงเวลาในรูปแบบที่คนอ่านแล้วเข้าใจได้ครับ [1]

strfttime()

กรณีที่เราต้องการกำหนดเองว่าจะให้แสดงผลอย่างไร เราสามารถทำได้โดยพิมพ์คำสั่ง strfttime นี้ตามภาพด้านล่าง

คำสั่ง strfttime ที่เราสามารถกำหนด Format ของเวลาที่แสดงได้

เมื่อเราพิมพ์คำสั่งนี้แล้ว ตัวคำสั่งจะคืนค่าเป็น string ในรูปแบบที่คนอ่านแล้วเข้าใจได้ดีกว่าเดิมครับ ส่วนตัว % ที่อยู่ในคำสั่งนั่นคืออะไรล่ะ? ตัวนี้ทำให้เรานึกถึงภาษาซีครับ ตัว % จะกำหนดว่าสิ่งที่เราต้องการให้แสดงนั่นคืออะไร เราสามารถสรุปได้ตามด้านล่างนี้ครับ

สัญลักษณ์ ความหมายตัวอย่าง
%a3 ตัวอักษรแรกของคำของวันในสัปดาห์Sun, Mon, …
%Aวันของสัปดาห์ในรูปแบบเต็ม ๆSunday, Monday, …
%wวันของสัปดาห์ที่แสดงในรูปแบบตัวเลขตั้งแต่ 0 คือวันอาทิตย์ จนถึง 6 คือวันเสาร์0, 1, …, 6
%dวันที่ของเดือน แสดงในรูปเลขสองหลัก (กรณีที่มีค่าน้อยกว่า 10 ตัวนี้จะเติม 0 ข้างหน้า)01, 02, …, 31
%-d วันที่ของเดือน1, 2, …, 30
%b3 ตัวอักษรแรกของเดือน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 หรือ PM01, 02, …, 12
%-I เวลาตั้งแต่ 1 – 12 นาฬิกา1, 2, … 12
%pAM หรือ PMAM, 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 โดยใช้ไลบรารี time

จากโค้ดที่ปรากฏด้านบน เราสามารถเปลี่ยน Time zone ได้โดยการตั้งค่าที่ os.environ[‘TZ’] แล้วพิมพ์ Time zone ตามที่เราต้องการ ในตัวอย่างจะใช้ Asia/Bangkok ครับ [3]

เทคนิคนี้มีข้อด้อยอย่างนึงก็คือการตั้งค่า Time zone เราจำเป็นต้องไปยุ่งกับ Environment Variable ซึ่งจะส่งผลต่อการใช้งานในฟังก์ชัน หรือในโปรแกรมอื่นด้วย และการตั้งค่าเรื่องเวลามันจะมี Daylight saving หรืออื่น ๆ ฟังดูยุ่งยากไปหน่อย วิธีนี้เราไม่ค่อยแนะนำ

เราแนะนำอีกวิธีครับ

ใช้ไลบรารี pytz

ไลบรารี pytz เป็นไลบรารีที่อนุญาตให้เราปรับ Time zone ได้ตามสะดวก ร่วมกันกับแก้ปัญหาเรื่อง Daylight saving ด้วย ทำให้ผู้ใช้สามารถใช้งานฟังก์ชันได้สะดวกมากกว่าเดิม [3] อย่างไรก็ดี ก่อนที่จะเริ่มใช้งาน เราจำเป็นต้องติดตั้งฟังก์ชันนี้ก่อน ทำได้โดยพิมพ์คำสั่ง

ติดตั้งไลบรารี pytz

กดปุ่ม Enter แล้ว เรารอไพทอนติดตั้งไลบรารีให้ เมื่อติดตั้งเสร็จแล้ว เราสามารถปรับ Time zone โดยการใช้ไลบรารีได้ โดยพิมพ์ตามด้านล่างนี้ครับ

การใช้ pytz เพื่อตั้งค่า 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/