วันที่และเวลาของไลบรารีมาตรฐานของ Python สามารถใช้ในการประมวลผลวันที่และเวลา (วันที่ เวลา และเวลา) เมธอด strftime() และ strptime() ซึ่งแปลงวันที่และเวลาเป็นและจากสตริง สามารถใช้เพื่อจัดการวันที่และเวลาในรูปแบบต่างๆ
นอกจากนี้ยังสามารถดำเนินการต่างๆ เช่น การลบและการบวก ตัวอย่างเช่น คุณสามารถคำนวณและรับวันที่เมื่อ 10 วันก่อนหรือ 3 สัปดาห์ต่อจากนี้ หรือเวลา 50 นาทีต่อจากนี้ได้อย่างง่ายดาย
อันดับแรก เราจะอธิบายคลาสของอ็อบเจ็กต์ต่อไปนี้ที่มีอยู่ในโมดูล datetime
datetime.datetime
:วันที่และเวลา (วันที่และเวลา)datetime.date
:วันที่datetime.time
:เวลาdatetime.timedelta
:ความแตกต่างของเวลาและเวลาที่ผ่านไป
มีการอธิบายวิธีการ strftime() และ strptime() ซึ่งแปลงวันที่/เวลาและสตริงให้กันและกัน
datetime
วัตถุdatetime.now()
:วันที่ของวันนี้ เวลาปัจจุบันdatetime
ตัวสร้างวัตถุ- การแปลงวัตถุ datetime เป็นวัตถุวันที่
date
วัตถุdate.today()
:วันนี้วันที่- ตัวสร้างสำหรับวัตถุวันที่
time
วัตถุ- ตัวสร้างสำหรับวัตถุเวลา
timedelta
วัตถุ- ลบวัตถุ datetime และ date เพื่อสร้างวัตถุ timedelta
- ตัวสร้างสำหรับอ็อบเจ็กต์ timedelta
- การลบและการบวกโดยใช้วัตถุ timedelta
strftime()
:การแปลงจากวันที่และเวลาเป็นสตริงstrptime()
:การแปลงจากสตริงเป็นวันที่และเวลา
ในไลบรารีมาตรฐานยังมีโมดูลปฏิทิน ซึ่งสร้างปฏิทินในรูปแบบข้อความธรรมดาหรือรูปแบบ HTML
วัตถุวันที่เวลา
ออบเจ็กต์ datetime คืออ็อบเจ็กต์ที่มีทั้งข้อมูลวันที่ (ปี เดือน วัน) และเวลา (ชั่วโมง นาที วินาที และไมโครวินาที) คุณสามารถเข้าถึงข้อมูลเหล่านั้นด้วยแอตทริบิวต์ต่อไปนี้
year
month
day
hour
minute
second
microsecond
datetime.now():วันที่ของวันนี้ เวลาปัจจุบัน
datetime.now() จะให้ออบเจกต์ datetime กับวันที่ของวันนี้ (วันที่ปัจจุบัน) และเวลาปัจจุบัน
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231
print(type(dt_now))
# <class 'datetime.datetime'>
print(dt_now.year)
# 2018
print(dt_now.hour)
# 18
ตัวสร้างสำหรับอ็อบเจ็กต์ datetime
นอกจากนี้ยังสามารถสร้างอ็อบเจ็กต์ datetime สำหรับวันที่และเวลาที่กำหนดเองได้
คอนสตรัคเตอร์สำหรับอ็อบเจ็กต์ datetime มีดังนี้
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
ค่าต่อไปนี้จำเป็นและค่าอื่นๆ สามารถละเว้นได้ หากไม่ระบุ ค่าเริ่มต้นจะเป็น 0
year
month
day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000
print(dt.minute)
# 15
print(dt.microsecond)
# 2000
dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00
print(dt.minute)
# 0
การแปลงวัตถุ datetime เป็นวัตถุวันที่
วัตถุ datetime สามารถแปลงเป็นวัตถุวันที่โดยวิธี date() ตามที่อธิบายไว้ถัดไป
print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>
print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>
วันที่วัตถุ
วัตถุวันที่เป็นวัตถุที่มีข้อมูลเกี่ยวกับวันที่ (ปี เดือน วัน) สามารถเข้าถึงได้โดยแอตทริบิวต์ปีเดือนและวัน
date.today():วันนี้วันที่
วัตถุ date ของวันที่ปัจจุบัน (วันที่ของวันนี้) สามารถรับได้ด้วย date.today()
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
ตัวสร้างสำหรับวัตถุวันที่
ตัวสร้างสำหรับวัตถุวันที่มีดังนี้
date(year, month, day)
ทั้งหมดจำเป็นและไม่สามารถละเว้นได้
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
วัตถุเวลา
ออบเจ็กต์เวลาคือออบเจ็กต์ที่มีข้อมูลเกี่ยวกับเวลา (ชั่วโมง นาที วินาที และไมโครวินาที) สามารถเข้าถึงได้โดยใช้แอตทริบิวต์ชั่วโมง นาที วินาที และไมโครวินาที
ตัวสร้างสำหรับวัตถุเวลา
ตัวสร้างของวัตถุเวลามีดังนี้
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
ทั้งหมดเป็นทางเลือก และหากละไว้ ค่าเหล่านี้จะถูกตั้งค่าเป็น 0
t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000
print(type(t))
# <class 'datetime.time'>
print(t.hour)
# 12
t = datetime.time()
print(t)
# 00:00:00
วัตถุไทม์เดลต้า
ออบเจ็กต์ timedelta เป็นอ็อบเจ็กต์ที่แสดงความแตกต่างของเวลาระหว่างวันที่สองวันและเวลา หรือเวลาที่ผ่านไป มีข้อมูลเป็นวัน วินาที และไมโครวินาที และสามารถเข้าถึงได้โดยแอตทริบิวต์ วัน วินาที และไมโครวินาที นอกจากนี้ยังสามารถรับจำนวนวินาทีทั้งหมดโดยใช้เมธอด total_seconds()
ลบวัตถุ datetime และ date เพื่อสร้างวัตถุ timedelta
การลบออบเจ็กต์ datetime ออกจากกันจะทำให้ได้ออบเจ็กต์ timedelta
td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231
print(type(td))
# <class 'datetime.timedelta'>
print(td.days)
# 1
print(td.seconds)
# 66673
print(td.microseconds)
# 271231
print(td.total_seconds())
# 153073.271231
การลบวัตถุวันที่ออกจากกันจะทำให้ได้วัตถุ timedelta ในทำนองเดียวกัน
ตัวสร้างสำหรับอ็อบเจ็กต์ timedelta
ตัวสร้างของวัตถุ timedelta มีดังนี้
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
ทั้งหมดเป็นทางเลือก และหากละไว้ ค่าเหล่านี้จะถูกตั้งค่าเป็น 0
โปรดทราบว่าวัตถุ timedelta จะเก็บข้อมูลต่อไปนี้เท่านั้น
- หลายวัน:
days
- จำนวนวินาที:
seconds
- ไมโครวินาทีนับ:
microseconds
ตัวอย่างเช่น สองตัวต่อไปนี้มีค่าเท่ากัน
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
การลบและการบวกโดยใช้วัตถุ timedelta
ออบเจ็กต์ timedelta สามารถใช้กับอ็อบเจ็กต์ datetime และ date เพื่อดำเนินการต่างๆ เช่น การลบและการบวก ตัวอย่างเช่น คุณสามารถคำนวณและรับวันที่หนึ่งสัปดาห์ที่แล้วหรือ 10 วันต่อจากนี้ หรือเวลา 50 นาทีต่อจากนี้ได้อย่างง่ายดาย
d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26
td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00
dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231
td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00
print(td_50m.seconds)
# 3000
dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231
นอกจากนี้ยังสามารถใช้ในการคำนวณจำนวนวันจนถึงวันที่ที่ระบุได้
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime():การแปลงจากวันที่และเวลาเป็นสตริง
สามารถใช้เมธอด strftime() ของออบเจ็กต์ datetime และ date เพื่อแปลงข้อมูลวันที่และเวลา (วันที่และเวลา) เป็นสตริงในรูปแบบรูปแบบใดก็ได้
รหัสการจัดรูปแบบ
ดูเอกสารอย่างเป็นทางการด้านล่างสำหรับรหัสการจัดรูปแบบที่มี
รหัสการจัดรูปแบบหลักแสดงอยู่ด้านล่าง
%d
:วันของเดือนในรูปแบบทศนิยมที่เติมศูนย์%m
:เดือนในรูปแบบทศนิยมที่เติมศูนย์%y
:เลขสองหลักสุดท้ายของปีในรูปแบบทศนิยมที่เติมศูนย์%Y
:ตัวเลขสี่หลักของปีในรูปแบบทศนิยมที่เติมศูนย์%H
:เมื่อแสดงเป็นทศนิยมโดยเติมศูนย์ (สัญกรณ์ 24 ชั่วโมง)%I
:เมื่อแสดงเป็นทศนิยมโดยเติมศูนย์ (สัญกรณ์ 12 ชั่วโมง)%M
:สำหรับสัญกรณ์ทศนิยมที่เติมศูนย์%S
:วินาทีในรูปแบบทศนิยมที่เติมศูนย์%f
:ไมโครวินาที (6 หลัก) ในรูปแบบทศนิยมโดยเติม 0%A
:ชื่อวันในสัปดาห์สำหรับสถานที่นั้น%a
:ชื่อวันสำหรับสถานที่ (แบบย่อ)%B
:ชื่อเดือนสถานที่%b
:ชื่อเดือนสถานที่ (แบบย่อ)%j
:วันของปีในรูปแบบทศนิยมที่เติมศูนย์%U
:หมายเลขสัปดาห์ของปีในรูปแบบทศนิยมที่เติมศูนย์ (สัปดาห์เริ่มต้นในวันอาทิตย์)%W
:หมายเลขสัปดาห์ของปีในรูปแบบทศนิยมที่เติมศูนย์ (สัปดาห์เริ่มต้นในวันจันทร์)
รหัสการจัดรูปแบบต่อไปนี้สำหรับชื่อวันและเดือนสามารถรับได้ในสตริงที่แตกต่างกันขึ้นอยู่กับสถานที่
%A
%a
%B
%b
นอกจากนี้ยังมีวิธีการเฉพาะสำหรับสตริงรูปแบบ ISO 8601
รหัสตัวอย่าง
print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13
print(d_today.strftime('%y%m%d'))
# 180202
print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018
print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05
หากคุณต้องการได้ตัวเลขแทนที่จะเป็นสตริง ให้แปลงเป็นจำนวนเต็มด้วย int()
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
เมื่อใช้ร่วมกับออบเจ็กต์ timedelta จะสร้างได้ง่ายๆ เช่น รายการวันที่รายปักษ์ในรูปแบบใดก็ได้
d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'
l = []
for i in range(n):
l.append((d + i * td).strftime(f))
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10
การใช้สัญกรณ์ความเข้าใจรายการจะฉลาดกว่า
l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
- บทความที่เกี่ยวข้อง:การใช้สัญกรณ์ความเข้าใจรายการ Python
strptime():การแปลงจากสตริงเป็นวันที่และเวลา
datetime strptime() สามารถใช้เพื่อสร้างวัตถุ datetime จากสตริงวันที่หรือเวลา จำเป็นต้องระบุสตริงการจัดรูปแบบที่สอดคล้องกับสตริงดั้งเดิม
นอกจากนี้ยังมีวิธีการเฉพาะสำหรับสตริง ISO 8601 (Python 3.7 หรือใหม่กว่า)
รหัสตัวอย่าง
date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00
print(type(date_dt))
# <class 'datetime.datetime'>
โดยการใช้เมธอด strftime() บนอ็อบเจ็กต์ datetime ที่ดึงมา คุณสามารถแสดงวันที่และเวลาในรูปแบบที่แตกต่างจากสตริงดั้งเดิมได้
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
หากคุณแปลงเป็นออบเจ็กต์ datetime คุณยังสามารถดำเนินการกับอ็อบเจ็กต์ timedelta ได้ ตัวอย่างเช่น คุณสามารถสร้างสตริงของวันที่เมื่อ 10 วันก่อนในรูปแบบเดียวกันได้
date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)
date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)
print(date_str_new)
# 2018-01-22