如何使用 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'