การแปลงวันที่และเวลาเป็นและจากสตริงใน Python datetime (strftime, strptime)

ธุรกิจ

วันที่และเวลาของไลบรารีมาตรฐานของ 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']

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