如何使用 Python datetime 模組轉換日期時間和字串,格式化日期時間
使用 Python datetime 模組將日期時間轉換為 ISO 格式的字串
Pythondatetime
模組的datetime
物件的__str__
方法,可將日期時間轉換為一個形式類似於YYYY-MM-DD hh:mm:ss[.ffffff]
(ISO 8601 格式,如果datetime
物件的microsecond
屬性不為0
,那麽將包含.ffffff
部分)的字串。當datetime
物件擁有有效的時區資訊時,字串將被追加與時區相關的尾碼+hh:mm[:ss[.ffffff]]
(ISO 8601 格式,如果時區擁有有效的秒和微秒,那麽將包含:ss
和.ffffff
部分)。當然,將datetime
物件傳遞給str
型別的建構子可以達到相同的效果。
Pythondatetime
模組的date
和time
物件的__str__
方法,與datetime
物件的__str__
方法類似,只不過其傳回的字串中僅包含日期或時間的資訊。當然,將date
或time
物件傳遞給str
型別的建構子可以達到相同的效果。
date|time|datetime.__str__()
str(date|time|datetime)
from datetime import date, time, datetime, timezone
# 取得 YYYY-MM-DD 形式的字串
date(2024, 9, 25).__str__()
'2024-09-25'
# 取得形式類似於 hh:mm:ss 的字串
time(8, 30, 0, 1234).__str__()
'08:30:00.001234'
# 取得形式類似於 YYYY-MM-DD hh:mm:ss 的字串
str(datetime(2024, 9, 25, 8, 30, 0, 1234, timezone.utc))
'2024-09-25 08:30:00.001234+00:00'
與__str__
方法類似,Pythondatetime
模組的datetime
物件的isoformat
方法,可將日期時間轉換為一個形式類似於YYYY-MM-DD<SEP>hh:mm:ss.ffffff+hh:mm:ss.ffffff
的字串,其中SEP
由函式的sep
參數指定。
Pythondatetime
模組的date
和time
物件的isoformat
方法,與datetime
物件的isoformat
方法類似,只不過其傳回的字串中僅包含日期或時間的資訊。
datetime.isoformat(sep='T', timespec='auto')
date.isoformat()
time.isoformat(timespec='auto')
- sep 參數
sep
參數為日期和時間之間的分隔符(單個字元),預設為'T'
。- timespec 參數
timespec
參數用於指示時間部分的格式,可以是以下取值之一。'auto'
(預設值)表示以格式hh:mm:ss
(如果datetime
物件的microsecond
屬性為0
)或hh:mm:ss.ffffff
(如果datetime
物件的microsecond
屬性不為0
)顯示時間,'hours'
表示以格式hh
顯示時間,'minutes'
表示以格式hh:mm
顯示時間,'seconds'
表示以格式hh:mm:ss
顯示時間,'milliseconds'
表示以格式hh:mm:ss.sss
(使用三位小數將微秒表示為毫秒)顯示時間,'microseconds'
表示以格式hh:mm:ss.ffffff
(包含完整的微秒部分)顯示時間。
from datetime import date, time, datetime, timezone
# 呼叫 isoformat 方法
date(2024, 9, 25).isoformat()
'2024-09-25'
# 使用三位小數將微秒表示為毫秒
time(8, 30, 0, 1234).isoformat('milliseconds')
'08:30:00.001'
# 完整的顯示微秒,並使用 ~ 作為分隔符
datetime(2024, 9, 25, 8, 30, 0, 1234, timezone.utc).isoformat('~', 'microseconds')
'2024-09-25~08:30:00.001234+00:00'
使用 Python datetime 模組將 ISO 格式的字串轉換為日期時間
Pythondatetime
模組的date
,time
和datetime
類別的類別方法fromisoformat
,可將符合 ISO 8601 格式的字串轉換為日期時間,其傳回值可能是date
,time
或datetime
物件。
date|datetime.fromisoformat(date_string)
time.fromisoformat(time_string)
- date_string 參數
date_string
參數是表示日期或日期時間的字串(符合 ISO 8601 格式),其中日期和時間之間的分隔符T
可以被取代為其他單個字元,比如S
。對於
date
物件,已知以下格式的字串不被fromisoformat
方法支援,YYYY-MM
,YYYY
,±YYYYYY-MM-DD
,YYYY-OOO
。對於
datetime
物件,已知小時和分鐘為小數(比如12:15.5:35
,需要指出,12:15.5
是有效的,因為他等同於12:15:00.5
)以及以下格式的字串不被fromisoformat
方法支援,YYYY-MM
,YYYY
,±YYYYYY-MM-DD
,YYYY-OOO
。- time_string 參數
time_string
參數是表示時間的字串(符合 ISO 8601 格式),其中小時和分鐘不能為小數,分隔符T
可以被省略但不能被取代為其他字元。
from datetime import date, time, datetime
# 將 ISO 字串轉換為日期
date.fromisoformat('2024-09-25')
datetime.date(2024, 9, 25)
# 將 ISO 字串轉換為時間
time.fromisoformat('03:15:20+08:00')
datetime.time(3, 15, 20, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
# 將 ISO 字串轉換為日期時間
datetime.fromisoformat('20240925T03:15:20Z')
datetime.datetime(2024, 9, 25, 3, 15, 20, tzinfo=datetime.timezone.utc)
# 2022 年的第一周的星期一
datetime.fromisoformat('2022-W01-1')
datetime.datetime(2022, 1, 3, 0, 0)
# datetime.fromisoformat 無法轉換時間
datetime.fromisoformat('03:15:20')
…
ValueError: Invalid isoformat string: '03:15:20'
使用 Python datetime 模組將日期時間轉換為 ctime 格式的字串
Pythondatetime
模組的date
和datetime
物件的ctime
方法,可將日期或日期時間轉換為一個形式類似於Wed Sep 25 08:30:00 2024
的字串,該字串與 C 語言的函式ctime
的執行結果一致。
date|datetime.ctime()
from datetime import date, datetime, timezone
# 取得 ctime 形式的字串
date(2024, 9, 25).ctime()
'Wed Sep 25 00:00:00 2024'
datetime(2024, 9, 25, 8, 30, 0, 1234, timezone.utc).ctime()
'Wed Sep 25 08:30:00 2024'
Python datetime 模組中的日期時間格式代碼
以上介紹的方法可以轉換日期時間或字串,但尚未提供足夠的靈活性,Pythondatetime
模組支援以下的日期時間格式代碼,用於更為方便的將日期時間格式化為字串,或將字串解析為日期時間。
- %y,%Y,%G 格式代碼
格式代碼
%y
,%Y
和%G
為自動補0
的年份,其中%y
是年份的最後兩位(兩位數),%Y
和%G
是完整的年份(四位數)。如果需要在 Windows 中使用
%y
,那麽年份需要大於等於1900
。- %b,%B 格式代碼
格式代碼
%b
和%B
為日期對應的月份的名稱,其中%b
為縮寫名稱(比如,Jan
,Feb
),%B
為完整名稱(比如,January
,February
)。- %m
格式代碼
%m
為自動補0
的月份(兩位數),01
為一月份。- %U,%W,%V 格式代碼
格式代碼
%U
,%W
和%V
為一年中的第幾周(以自動補0
的兩位數表示,00
為第零周),其中%U
會將一年中的第一個星期日視為第一周的開始,%W
和%V
會將一年中的第一個星期一視為第一周的開始。- %a,%A 格式代碼
格式代碼
%a
和%A
為日期對應的當周日次的名稱,其中%a
為縮寫名稱(比如,Sun
,Mon
),%A
為完整名稱(比如,Sunday
,Monday
)。- %w,%u 格式代碼
格式代碼
%w
和%u
為日期對應的當周日次。對於%w
,0
表示星期日,1
表示星期一,6
表示星期六。對於%u
,1
表示星期一,6
表示星期六,7
表示星期日。- %j 格式代碼
格式代碼
%j
表示日期為一年中的第幾天(自動補0
的三位數),001
表示第一天。- %d 格式代碼
格式代碼
%d
表示日期為一月中的第幾天(自動補0
的兩位數),01
表示第一天。- %H,%I 格式代碼
格式代碼
%H
和%I
為自動補0
的小時(兩位數),其中%H
為 24 小時製(00
表示零時),%I
為 12 小時製(12
表示十二時)。- %M 格式代碼
格式代碼
%M
為分鐘(以自動補0
的兩位數表示),00
表示零分。- %S 格式代碼
格式代碼
%S
為秒數(以自動補0
的兩位數表示),00
為零秒。- %f 格式代碼
格式代碼
%f
為微秒(以自動補0
的六位數表示),000000
為零微秒。- %z,%:z,%Z 格式代碼
格式代碼
%z
,%:z
以格式±hhmm[ss[.ffffff]]
或±hh:mm[:ss[.ffffff]]
顯示時區資訊,空的時區資訊對應空字串。格式代碼%Z
表示時區的名稱,空的時區資訊對應空字串。- %c,%x,%X,%p 格式代碼
格式代碼
%c
為日期時間的本機化表示,格式代碼%x
為日期的本機化表示,格式代碼%X
為時間的本機化表示,格式代碼%p
為 AM 和 PM 的本機化表示。- %% 格式代碼
格式代碼
%%
為字元%
自身。
使用 Python datetime 模組和格式代碼將日期時間轉換為字串
Pythondatetime
模組的date
,time
和datetime
物件的strftime
方法,可使用指定的格式代碼將日期時間轉換為字串。
date|time|datetime.strftime(format)
- format 參數
format
參數是一個字串,包含用於將日期時間轉換為字串的格式代碼。
from datetime import date, time, datetime, timezone
d = date(2024, 9, 22)
# 年份,月份名稱,月份
d.strftime('%y %Y %G %b %B %m')
'24 2024 2024 Sep September 09'
# 第幾周,當周日次的名稱,當周日次
d.strftime('%U %W %V %a %A %w %u')
'38 38 38 Sun Sunday 0 7'
# 一年中的第幾天,一月中的第幾天
d.strftime('%j %d')
'266 22'
t = time(13, 45, 15, 123456)
# 小時,分鐘,秒,微秒
t.strftime('%H %I %M %S %f')
'13 01 45 15 123456'
dt = datetime(2024, 9, 25, 13, 45, 15, 123456, timezone.utc)
# 時區,AM PM,%
dt.strftime('%z %:z %Z %p %%')
'+0000 +00:00 UTC PM %'
# 本機化日期時間,本機化日期,本機化時間
dt.strftime('%c %x %X')
'Wed Sep 25 13:45:15 2024 09/25/24 13:45:15'
Python datetime 模組的 strftime 方法的預設日期時間
如果格式代碼對應的日期時間資訊不存在,strftime
方法會采用一些預設值。比如,當 Pythondatetime
模組的time
物件希望顯示日期時,年份將預設為1900
,月份和日將預設為1
,當 Pythondatetime
模組的date
物件希望顯示時間時,小時,分鐘,秒和微秒均預設為0
(不一定會顯示為0
)。
from datetime import date, time
# 嘗試顯示 date 物件的時間
date(2024, 9, 22).strftime('%H %M %S')
'00 00 00'
# 嘗試顯示 time 物件的日期
time(13, 45, 15, 123456).strftime('%Y %m %d')
'1900 01 01'
使用 Python datetime 模組和格式代碼將字串轉換為日期時間
Pythondatetime
模組的datetime
類別的類別方法strptime
,可使用指定的格式代碼將字串解析為日期時間(datetime
物件),該方法預設的日期時間為 1900 年 1 月 1 日 0 時 0 分 0 秒,如未給出相關資訊,比如年份,則保留其預設值。
datetime.strptime(date_string, format)
- date_string 參數
date_string
參數是表示日期時間的字串。- format 參數
format
參數是一個字串,包含用於將字串解析為日期時間的格式代碼。
from datetime import datetime
# 預設日期時間
datetime.strptime('', '')
datetime.datetime(1900, 1, 1, 0, 0)
datetime.strptime('1 1 2024, 1 45 15=+083030', '%d %m %Y, %I %M %S=%z')
datetime.datetime(2024, 1, 1, 1, 45, 15, tzinfo=datetime.timezone(datetime.timedelta(seconds=30630)))
# 2024 年的第 200 天
datetime.strptime('2024+200', '%Y+%j')
datetime.datetime(2024, 7, 18, 0, 0)
Python datetime 模組的 strptime 方法所解析的微秒會自動補 0
如果在 Pythondatetime
模組的datetime
類別的類別方法strptime
中使用格式代碼%f
,那麽微秒會在右邊自動補0
,當微秒小於六位時,比如,書寫123
等同於書寫123000
。這不同於格式代碼%M
和%S
,他們會在左邊自動補0
。
當然,如果你希望解析後的微秒為123
,那麽應該在strptime
方法中書寫000123
。
from datetime import datetime
# 等同於 123000
datetime.strptime('123', '%f')
datetime.datetime(1900, 1, 1, 0, 0, 0, 123000)
datetime.strptime('000123', '%f')
datetime.datetime(1900, 1, 1, 0, 0, 0, 123)
Python datetime 模組的 strptime 方法不支援格式代碼 %:z
在 Pythondatetime
模組的datetime
類別的類別方法strptime
中,你需要使用格式代碼%z
而不是%:z
來解析時區資訊,%z
允許冒號:
的存在。
from datetime import datetime
# %z 允許冒號的存在
datetime.strptime('+08:00', '%z')
datetime.datetime(1900, 1, 1, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
# 不支援 %:z
datetime.strptime('+08:00', '%:z')
…
ValueError: ':' is a bad directive in format '%:z'
Python datetime 模組的 strptime 方法所解析的完整年份需要補 0
如果使用 Pythondatetime
模組的datetime
類別的類別方法strptime
解析完整的年份,比如使用格式代碼%Y
,那麽小於一千的年份需要補0
至四位小數,否則將引發例外狀況ValueError
。
from datetime import datetime
datetime.strptime('0024', '%Y')
datetime.datetime(24, 1, 1, 0, 0)
# 需要書寫為 0024
datetime.strptime('24', '%Y')
…
ValueError: time data '24' does not match format '%Y'
Python datetime 模組的 strptime 方法中的格式代碼 %Y 和 %G 不能互換
對於 Pythondatetime
模組的datetime
類別的類別方法strptime
,格式代碼%Y
可以和%U
或%W
一同使用,而格式代碼%G
可以和%V
一同使用,這裏不能將%Y
取代為%G
,或將%G
取代為%Y
。
from datetime import datetime
# %Y 可以和 %W 一起使用
datetime.strptime('2024/2/2', '%Y/%W/%u')
datetime.datetime(2024, 1, 9, 0, 0)
# %G 可以和 %V 一起使用
datetime.strptime('2024/2/2', '%G/%V/%u')
datetime.datetime(2024, 1, 9, 0, 0)
Python datetime 模組的 strptime 方法中的格式代碼 %y 要求年份末尾兩位擁有前置零
對於 Pythondatetime
模組的datetime
類別的類別方法strptime
,格式代碼%y
要求年份末尾兩位擁有前置零,而格式代碼%m
,%U
,%W
,%V
,%j
,%d
,%H
,%I
,%M
和%S
沒有此要求。
from datetime import datetime
# 年份的末尾兩位為 04
datetime.strptime('04-56 1:1:1', '%y-%j %H:%M:%S')
datetime.datetime(2004, 2, 25, 1, 1, 1)
# 沒有前置零會出現錯誤
datetime.strptime('4', '%y')
…
ValueError: time data '4' does not match format '%y'