Time zone ในภาษา Python
เขตเวลา (Time zone) คือการแบ่งเวลาออกเป็นเขตต่างๆ ตามแนวเส้นละติจูดของโลกโดยอ้างอิงจากเวลาสากลเชิงพิกัด (UTC) ที่ตั้งอยู่ที่ละติจูดที่ 0 เขตเวลานั้นใช้สำหรับอ้างอิงเวลาในท้องที่เพื่อใช้ในทางกฏหมาย การค้าหรือทางการเมือง โดยทั่วไปแล้วเขตเวลามักจะถูกแบ่งโดยใช้ขอบประเทศ และในโลกของเราเขตเวลาได้ถูกแบ่งออกเป็น 24 เขต
ในบทเรียนนี้ คุณจะได้เรียนรู้การเขียนโปรแกรมที่ทำงานกับเขตเวลาในภาษา Python นี่เป็นเนื้อหาในบทนี้
- เขตเวลาปัจุจุบันของระบบ
- ออบเจ็ค timezone
- เวลาสากลเชิงพิกัด (UTC)
- โปรแกรมแสดงเวลาโลก
เขตเวลาปัจุจุบันของระบบ
ในภาษา Python ออบเจ็คของวันที่และเวลาเช่น datetime
, date
, และ time
เป็นออบเจ็คที่ไม่มีข้อมูลเกี่ยวกับเขตเวลากำกับอยู่ด้วย นั่นหมายความว่าในการทำงานกับออบเจ็คเหล่านี้ เราสามารถทราบวันที่และเวลาได้ แต่ไม่ทราบว่าวันที่และเวลานั้นอยู่ในเขตเวลาอะไร
ในตัวอย่างนี้เป็นการสร้างออบเจ็คของวันที่และเวลาปัจจุบันจากระบบด้วยเมธอด today()
จากนั้นแสดงเวลาออกทางหน้าจอโดยการเรียกใช้งานเมธอด isoformat()
from datetime import datetime
now = datetime.today()
print(now.isoformat())
# Output: 2020-12-31T01:00:02.860676
เมธอด isoformat()
ใช้สำหรับแสดงเวลาในรูปแบบของเวลามาตฐาน ISO โดยทั่วไปแล้วเวลาในรูปแบบนี้จะแสดงข้อมูลเกี่ยวกับเขตเวลาด้วยถ้าหากมี เนื่องจากออบเจ็คไม่มีข้อมูลของเขตเวลา ดังนั้นมีเพียงวันที่และเวลาเท่านั้นที่ถูกแสดงออกทางหน้าจอ
เพื่อตรวจสอบเขตเวลาปัจจุบันในระบบ เราสามารถทำได้โดยการอ่านค่าจากค่าคงที่ในโมดูล time
ดังตัวอย่างต่อไปนี้
import time
print(time.timezone / 3600.0)
# Output: -7.0
ค่าที่คง timezone
นั้นเก็บเวลาอ้างอิงในหน่วยวินาทีจากเวลา UTC ค่าที่ส่งกลับเป็น -7 หมายความว่าเวลา UTC ช้ากว่าเขตเวลาปัจจุบัน 7 ชั่วโมง ซึ่งค่านี้เป็นค่าอ้างอิงของเขตเวลาในประเทศไทยที่สามารถเขียนได้เป็น UTC+7
เพื่อทำให้การแสดงผลเขตเวลาสามารถอ่านเข้าใจได้ง่ายขึ้น เราสามารถจัดรูปแบบการแสดงผลได้เป็นดังนี้ ซึ่งนี่เป็นรูปแบบของเขตเวลาที่เราคุ้นเคยกัน
import time
tz_offset = int(time.timezone / 3600 * -1)
print("UTC+%d" % tz_offset)
# Output: UTC+7
ออบเจ็ค timezone
ในภาษา Python มีออบเจ็คของเขตเวลาที่เราสามารถสร้างได้จากคลาส timezone
นี่เป็นออบเจ็คของเขตเวลาที่สามารถนำไปใช้กับออบเจ็คของวันที่และเวลาเพื่อควบคุมเขตเวลาของโปรแกรมได้ นี่เป็นรูปแบบของการสร้างออบเจ็คของเขตเวลาในภาษา Python
tz = timezone(timedelta_offset)
เพื่อสร้างออบเจ็คเราใช้คลาส timezone
โดยส่งพารามิเตอร์ผ่านคอนสตรัคเตอร์ของคลาสเป็น timedelta
ออบเจ็คของเวลาอ้างอิงจากเวลา UTC ยกตัวอย่างเช่น ถ้าเราต้องการสร้างออบเจ็คของเขตเวลาในประเทศไทย จะสามารถส่งพารามิเตอร์ได้เป็น timedelta(hours = 7)
เมื่อออบเจ็คของเขตเวลาถูกสร้าง เราสามารถนำมันไปใช้กับออบเจ็คของวันที่และเวลาในโปรแกรมได้ นี่เป็นตัวอย่างการสร้างวันที่โดยกำหนดเขตเวลาเป็น UTC+7 ซึ่งเป็นเวลาในประเทศไทย
from datetime import datetime, timezone, timedelta
# Time zone in Thailand UTC+7
tz = timezone(timedelta(hours = 7))
# Create a date object with given timezone
date = datetime.now(tz=tz)
# Reading infomation about time zone
print("Time zone offset: %s" % date.utcoffset())
print("Time zone name: %s" % date.tzname())
# Display time
print(date.isoformat(sep = " "))
print(date.ctime())
print(date.utcnow())
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
Time zone offset: 7:00:00
Time zone name: UTC+07:00
2020-11-05 20:25:57.946231+07:00
Thu Nov 5 20:25:57 2020
2020-11-05 13:25:57.946231
ในตัวอย่างนี้ แสดงการสร้างออบเจ็คของวันที่จากเขตเวลาที่กำหนดโดยใช้เขตเวลาในประเทศไทย UTC+7 ก่อนอื่นเราจะต้องสร้างออบเจ็คของเขตเวลาขึ้นมาก่อน
tz = timezone(timedelta(hours = 7))
ในภาษา Python เราสามารถสร้างออบเจ็คของเขตเวลาได้จากคลาส timezone
คลาสนี้เป็นคลาสที่ใช้กำหนดเขตเวลาให้กับออบเจ็คของวันที่ สำหรับค่าอ้างอิงของเวลานั้นจะต้องส่งเป็น timedelta
ในตัวอย่างเป็นการสร้างออบเจ็คของเขตเวลาในประเทศไทย ที่มีค่าอ้างอิงของเวลาเป็น UTC+7
date = datetime.now(tz=tz)
ในตัวอย่างที่ผ่านมาเราได้สร้างออบเจ็คของวันที่ปัจจุบันด้วยเมธอด today()
ซึ่งมันเป็นออบเจ็คที่ไม่มีข้อมูลเกี่ยวกับเขตเวลา ในครั้งนี้เราใช้เมธอด now()
ในการสร้างแทน เนื่องจากเราสามารถกำหนดเขตเวลาให้กับออบเจ็คผ่านอาร์กิวเมนต์ tz
ของเมธอดได้
print("Time zone offset: %s" % date.utcoffset())
print("Time zone name: %s" % date.tzname())
เราสามารถเรียกดูข้อมูลเกี่ยวกับเขตเวลาจากออบเจ็คของวันที่ได้ เมธอด date.utcoffset()
ส่งค่ากลับเป็น timedelta
ออบเจ็คในรูปแบบเวลาอ้างอิงจากเวลา UTC ส่วนเมธอด tzname()
ส่งค่ากลับเป็นชื่อของเขตเวลาในรูปแบบ UTC+HH:MM
print(date.isoformat(sep = " "))
print(date.ctime())
print(date.utcnow())
จากนั้นเราได้เรียกใช้เมธอดสำหรับแสดงเวลาปัจจุบันออกทางหน้าจอ เมธอด isoformat()
และเมธอด
ctime()
จะแสดงเวลาในเขตเวลาปัจจุบันเสมอ ถ้าหากเราต้องการแสดงเวลาในเขตเวลา UTC สามารถทำได้โดยการใช้เมธอด utcnow()
ซึ่งเป็นคลาสเมธอดจากคลาส datetime
ในการเรียกใช้งานเมธอด isoformat()
บนออบเจ็คที่มีเขตเวลา ข้อมูลที่แสดงจะประกอบไปด้วยเขตเวลาด้วยเหมือนกับที่คุณเห็นในผลลัพธ์ของโปรแกรม นั้นคือ +07:00
ถ้าหากคุณต้องการสร้างออบเจ็คของวันที่จากวันที่และเวลาอื่นๆ ที่ไม่ใช่เวลาปัจจุบัน และต้องการสร้างออบเจ็คพร้อมกับเขตเวลาด้วย คุณสามารถทำได้โดยการใช้เมธอดต่อไปนี้
from datetime import datetime, timezone, timedelta
tz = timezone(timedelta(hours = 7))
date1 = datetime(1980, 3, 12, 10, 0, 0, tzinfo=tz)
date2 = datetime.fromtimestamp(321678000, tz=tz)
date3 = datetime.fromisoformat("1980-03-12T10:00:00+07:00")
print(date1.isoformat())
print(date2.isoformat())
print(date3.isoformat())
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
1980-03-12T10:00:00+07:00
1980-03-12T10:00:00+07:00
1980-03-12T10:00:00+07:00
ในตัวอย่างนี้ แสดงการสร้างวันที่ด้วยวิธีการต่างๆ พร้อมกับเขตเวลา ในการสร้างวันที่ด้วยคลาสคอนสตรัคเตอร์ datetime
เรากำหนดเขตเวลาด้วย Keyword อาร์กิวเมนต์ tzinfo
เมื่อสร้างด้วยเมธอด fromtimestamp()
เรากำหนดเขตเวลาด้วย Keyword อาร์กิวเมนต์ tz
สุดท้ายในการสร้างวันที่ด้วยเมธอด fromisoformat()
ในการสร้างออบเจ็คด้วยเมธอดนี้ เขตเวลาที่ระบุใน String ของวันที่จะถูกใช้เป็นเขตเวลาของออบเจ็คอัตโนมัติ
เวลาสากลเชิงพิกัด (หรือเวลา UTC)
เวลาสากลเชิงพิกัดหรือ Coordinated Universal Time (UTC) เป็นเวลามาตฐานหลักที่นาฬิกาทั่วโลกใช้ในการอ้างอิงวันที่และเวลา เวลา UTC จะไม่ถูกปรับไปตามเวลาออมแสง (Daylight saving time) และมันเป็นเวลาที่เท่ากับเวลามาตรฐานกรีนิช (GMT) เวลา UTC จะคงที่เสมอและไม่ขึ้นอยู่กับสถานที่และเขตเวลาใดๆ
เวลา UTC มักถูกใช้ในการเขียนโปรแกรมสำหรับเก็บค่าของเวลาเพื่อใช้งานในโปรแกรม นี่เป็นวิธีฝึกปฏิบัติที่ดีในการเก็บข้อมูลของเวลาในรูปแบบเวลา UTC เนื่องจากมันเป็นเวลามาตรฐานที่เขตเวลาต่างๆ ใช้ในการอ้างอิง และเราสามารถแปลงมันไปยังเขตเวลาใดๆ
ยกตัวอย่างเช่น ถ้าคุณเขียนโปรแกรมสำหรับแสดงบทความพร้อมกับเวลาที่มันถูกเผยแพร่ คุณควรเก็บเวลาในรูปแบบของเวลา UTC เมื่อผู้อ่านบทความของคุณมาจากประเทศไทย แค่นำเวลา UTC มาแปลงเป็นเวลาในประเทศไทย และทำเช่นเดียวกันสำหรับผู้อ่านที่มาจากประเทศอื่นๆ
ในภาษา Python เราสามารถสร้างออบเจ็คของเขตเวลา UTC ได้สองวิธี วิธีแรกคือการกำหนดเขตเวลาอ้างอิงเป็น 0 ส่วนวิธีที่สองใช้ออบเจ็คจากค่าคงที่ utc
ที่อยู่ในคลาส timezone
นี่เป็นตัวอย่าง
tz1 = timezone(timedelta(hours = 0))
# or
tz2 = timezone.utc
ทั้งสองวิธีเป็นการสร้างออบเจ็คของเขตเวลา UTC คุณสามารถทำได้โดยสร้างจากคลาส timezone
โดยการใช้เวลาอ้างอิงจาก timedelta
ออบเจ็คเป็น 0 ชั่วโมง หรือแบบที่สองโดยการใช้จากค่าคงที่ utc
ซึ่งเป็นออบเจ็คของเขตเวลา UTC ที่กำหนดไว้ในคลาส timezone
หลังจากที่เราได้รับออบเจ็คของเขตเวลา UTC แล้ว เราสามารถนำมันไปสร้างออบเจ็คของเวลา UTC ได้โดยการกำหนดเขตเวลาให้กับออบเจ็คของวันที่เหมือนกับในตัวอย่างที่ผ่านมา ในตัวอย่างนี้เป็นการสร้างออบเจ็คของเวลาปัจจุบันในเขตเวลา UTC
from datetime import datetime, timezone, timedelta
# Create UTC date objects
utc_date1 = datetime.now(tz=timezone(timedelta(hours = 0)))
utc_date2 = datetime.now(tz=timezone.utc)
print(utc_date1.isoformat())
print(utc_date2.isoformat())
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
2020-12-31T17:01:41.202087+00:00
2020-12-31T17:01:41.202087+00:00
ในตัวอย่าง เป็นการสร้างออบเจ็คของเวลา UTC โดยการระบุเขตเวลาให้กับออบเจ็ค เพื่อสร้างออบเจ็คของเวลา UTC เราเพียงแค่ส่งออบเจ็คของเขตเวลา UTC ให้กับเมธอด now()
ในตอนสร้าง สำหรับออบเจ็คของเขตเวลา UTC นั้นสามารถได้มาจากสองวิธีที่เราได้แสดงให้ดูในตัวอย่างก่อนหน้า
นอกจากนี้ภาษา Python ยังมีเมธอดสำหรับอำนวยความสะดวกในการสร้างเวลา UTC โดยคุณสามารถใช้เมธอด utcnow()
ซึ่งเมธอดนี้ส่งค่ากลับเป็นออบเจ็คของเวลา UTC ที่ไม่มีข้อมูลเกี่ยวกับเขตเวลา นี่เป็นตัวอย่าง
from datetime import datetime, timezone, timedelta
utc_date = datetime.utcnow()
print(utc_date.isoformat())
# Output: 2020-12-31T17:13:50.539179
ในการสร้างเวลา UTC ด้วยวิธีนี้ ออบเจ็คจะไม่มีข้อมูลเกี่ยวกับเขตเวลา มันเป็นหน้าที่ของคุณที่ต้องทราบว่าจะจัดการและนำมันไปใช้งานอย่างไร ถ้าหากคุณต้องการข้อมูลเกี่ยวกับเขตเวลา คุณสามารถสร้างวันที่ด้วยเมธอด now()
เหมือนในตัวอย่างก่อนหน้าได้
ตัวอย่างโปรแกรมแสดงเวลาโลก
โปรแกรมแสดงเวลาโลกคือโปรแกรมที่แสดงเวลาท้องถิ่นปัจจุบันในประเทศและเมืองต่างๆ โดยขึ้นกับเขตเวลาในท้องที่หรือเมืองนั้นๆ ตั้งอยู่ ในตัวอย่างนี้ เราจะเขียนโปรแกรมสำหรับแสดงเวลาปัจจุบันที่เมืองต่างๆ จากการประยุกต์ใช้งานเขตเวลาในภาษา Python นี่เป็นโค้ดของโปรแกรม
from datetime import datetime, timezone, timedelta
cities = [
{ 'name': 'UTC', 'timezone': 0 },
{ 'name': 'Sydney', 'timezone': 11 },
{ 'name': 'Tokyo', 'timezone': 9 },
{ 'name': 'Bangkok', 'timezone': 7 },
{ 'name': 'London', 'timezone': 0 },
{ 'name': 'Toronto', 'timezone': -5 },
{ 'name': 'Los Angeles', 'timezone': -8 },
]
print("CITY\tLOCAL TIME")
for c in cities:
tz = timezone(timedelta(hours = c['timezone']))
date = datetime.now(tz=tz)
print("%s\t%s" % (c['name'], date.ctime()))
นี่เป็นผลลัพธ์การทำงานของโปรแกรมจากการแสดงเวลาท้องถิ่นปัจจุบันที่เมืองต่างๆ ทั่วโลก
CITY LOCAL TIME
UTC Thu Dec 31 17:34:37 2020
Sydney Fri Jan 1 04:34:37 2021
Tokyo Fri Jan 1 02:34:37 2021
Bangkok Fri Jan 1 00:34:37 2021
London Thu Dec 31 17:34:37 2020
Toronto Thu Dec 31 12:34:37 2020
Los Angeles Thu Dec 31 09:34:37 2020
ในตัวอย่าง เป็นโปรแกรมแสดงเวลาโลกโดยแสดงเวลาท้องถิ่นปัจจุบันที่เมืองต่างๆ เปรียบเทียบกับเวลา UTC ที่ถูกแสดงไว้ด้านบนสุด
cities = [
{ 'name': 'UTC', 'timezone': 0 },
{ 'name': 'Sydney', 'timezone': 11 },
{ 'name': 'Tokyo', 'timezone': 9 },
...
]
ในตอนแรกเราได้ประกาศตัวแปรอาเรย์ cities
สำหรับเก็บ Dictionary ที่เก็บชื่อและเขตเวลาของเมือง เพื่อใช้แสดงในโปรแกรมของเรา และคุณสามารถเพิ่มเมืองและเขตเวลาของเมืองนั้นๆ เข้าไปในลิสต์ได้หากต้องการ
for c in cities:
tz = timezone(timedelta(hours = c['timezone']))
date = datetime.now(tz=tz)
print("%s\t%s" % (c['name'], date.ctime()))
จากนั้นใช้คำสั่ง for loop วนสร้างออบเจ็คของวันที่พร้อมกับเขตเวลาของเมืองต่างๆ ในตัวอย่างนี้ เรารันโปรแกรมเมื่อวันที่ 1 มกราคม 2021 เวลา 00:34 ที่ประเทศไทย และเนื่องจากประเทศไทยมีเขตเวลาเป็น UTC+7 จะเห็นว่าเวลาในประเทศไทยนั้นจะเร็วกว่าเวลา UTC อยู่ 7 ชั่วโมง
เราได้แสดงเวลา UTC อยู่ที่ด้านสุดเพื่อเปรียบเทียบให้คุณเห็นว่าเวลาในเขตอื่นๆ นั้นอ้างอิงจากเวลานี้ ยกตัวอย่างเช่นที่เมือง Bangkok เวลาจะเร็วกว่าเวลา UTC อยู่ 7 ชั่วโมง ในขณะที่เมือง Los Angeles เวลาจะช้ากว่าเวลา UTC อยู่ 8 ชั่วโมง นั่นหมายความว่าเวลาในเมือง Bangkok นั่้นเร็วกว่าเมือง Los Angeles อยู่ 15 ชั่วโมง และนี่เป็นวิธีการทำงานของเขตเวลา
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับเขตเวลาในภาษา Python ซึ่งเป็นสิ่งที่มีประโยชน์เมื่อคุณต้องเขียนโปรแกรมเพื่อแสดงเวลาตามภูมิภาคต่างๆ ของโลก การแสดงวันที่และเวลาให้ตรงกับเขตเวลาที่ผู้ใช้งานอยู่นั้นเป็นวิธีที่ดีในการแสดงเวลาในการเขียนโปรแกรม