Time zone ในภาษา Python

8 January 2021

เขตเวลา (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 ซึ่งเป็นเวลาในประเทศไทย

timezone.py
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

ถ้าหากคุณต้องการสร้างออบเจ็คของวันที่จากวันที่และเวลาอื่นๆ ที่ไม่ใช่เวลาปัจจุบัน และต้องการสร้างออบเจ็คพร้อมกับเขตเวลาด้วย คุณสามารถทำได้โดยการใช้เมธอดต่อไปนี้

timezone2.py
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

utc_datetime.py
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 ที่ไม่มีข้อมูลเกี่ยวกับเขตเวลา นี่เป็นตัวอย่าง

utc_datetime2.py
from datetime import datetime, timezone, timedelta

utc_date = datetime.utcnow()
print(utc_date.isoformat())
# Output: 2020-12-31T17:13:50.539179

ในการสร้างเวลา UTC ด้วยวิธีนี้ ออบเจ็คจะไม่มีข้อมูลเกี่ยวกับเขตเวลา มันเป็นหน้าที่ของคุณที่ต้องทราบว่าจะจัดการและนำมันไปใช้งานอย่างไร ถ้าหากคุณต้องการข้อมูลเกี่ยวกับเขตเวลา คุณสามารถสร้างวันที่ด้วยเมธอด now() เหมือนในตัวอย่างก่อนหน้าได้

ตัวอย่างโปรแกรมแสดงเวลาโลก

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

world_clock.py
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 ซึ่งเป็นสิ่งที่มีประโยชน์เมื่อคุณต้องเขียนโปรแกรมเพื่อแสดงเวลาตามภูมิภาคต่างๆ ของโลก การแสดงวันที่และเวลาให้ตรงกับเขตเวลาที่ผู้ใช้งานอยู่นั้นเป็นวิธีที่ดีในการแสดงเวลาในการเขียนโปรแกรม

บทความนี้เป็นประโยชน์หรือไม่? Yes · No