在 Python datetime (strftime, strptime) 中將日期和時間與字符串相互轉換

商業

Python 的標準庫 datetime 可用於處理日期和時間(日期、時間和時間)。 strftime() 和 strptime() 方法將日期和時間與字符串相互轉換,可用於處理各種格式的日期和時間。

它還可以執行減法和加法等運算。例如,您可以輕鬆計算並獲取 10 天前或 3 週後的日期,或 50 分鐘後的時間。

首先,我們將描述 datetime 模塊中可用的以下對像類。

  • datetime.datetime日期和時間(日期和時間)
  • datetime.date日期
  • datetime.time時間
  • datetime.timedelta時差和經過時間

還解釋了將日期/時間和字符串相互轉換的方法 strftime() 和 strptime()。

  • datetime目的
    • datetime.now()今天的日期,當前時間
    • datetime對象構造函數
    • 將日期時間對象轉換為日期對象
  • date目的
    • date.today()今天的日期
    • 日期對象的構造函數
  • time目的
    • 時間對象的構造函數
  • timedelta目的
    • 減去 datetime 和 date 對像以創建 timedelta 對象。
    • timedelta 對象的構造函數
    • 使用 timedelta 對象進行減法和加法
  • strftime()從日期和時間到字符串的轉換
  • strptime()從字符串到日期和時間的轉換

標準庫中還包括日曆模塊,它生成純文本或 HTML 格式的日曆。

日期時間對象

日期時間對像是同時具有日期(年、月、日)和時間(時、分、秒、微秒)信息的對象。您可以使用以下屬性訪問這些信息。

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now():今天的日期,當前時間

datetime.now() 會給你一個帶有今天日期(當前日期)和當前時間的日期時間對象。

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(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

將日期時間對象轉換為日期對象

日期時間對象可以通過 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.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():從日期和時間到字符串的轉換

datetime 和 date 對象的 strftime() 方法可用於將日期和時間(日期和時間)信息轉換為任何格式格式的字符串。

格式化代碼

有關可用的格式代碼,請參閱下面的官方文檔。

下面列出了主要的格式代碼。

  • %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() 可用於從日期或時間字符串創建日期時間對象。需要指定原始字符串對應的格式化字符串。

還有一種用於 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() 方法,您可以用不同於原始字符串的格式來表示日期和時間。

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
Copied title and URL