Python Datetime 模块

Datetime 模块允许我们处理日期和时间对象。它提供了三种额外的数据类型:datetimedatetime

import datetime

date()

datetime.date(year: int, month: int, day: int)

date 方法返回一个具有 yearmonthday 属性的日期对象:

from datetime import date
# 创建一个日期对象
obj = date(2022, 12, 1)
# 访问 year 属性
obj.year
2022
obj.month
12
obj.day
1

time()

datetime.time(hour: int, minute: int, second: int)

time 方法返回一个具有 hourminutesecondmicrosecondtzinfo 属性的时间对象:

from datetime import time
# 创建一个时间对象
obj = time(10, 20, 33)
# 访问 hour 属性
obj.hour
10
obj.second
33
obj.microsecond
0

datetime()

datetime.datetime(year, month, day, hour, minute, second)

datetime 返回一个同时包含 datetime 对象属性的对象:

from datetime import datetime
# 使用日期和时间创建一个 datetime 对象
obj = datetime(2024, 12, 1, 15, 35, 59)
# 访问 year 属性
obj.year
2024
obj.month
12
obj.day
1
obj.hour
15
obj.second
59

now() 和 today()

nowtoday 方法返回一个具有系统确切日期和时间的 datetime 对象:

from datetime import datetime
# 获取当前日期和时间
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 19, 56, 49, 589806)

因为返回的对象是 datetime,我们可以同时访问 datetime 属性:

now.date()
datetime.date(2022, 7, 23)
now.time()
datetime.time(19, 56, 49, 589806)
now.year
2022
now.month
7
now.day
23
now.hour
19
now.minute
56
now.second
49
now.microsecond
589806

此外,now 可以接受一个 timezone 对象作为可选参数:

from datetime import datetime, timezone
# 获取当前 UTC 时间
datetime.now(timezone.utc)
datetime.datetime(2022, 7, 24, 0, 20, 8, 265634, tzinfo=datetime.timezone.utc)

如果未指定 timezone 参数,now 将默认为系统时区。

strftime() 和 strptime()

您可以使用 strftimestrptime 方法轻松地在字符串和 datetime 对象之间进行转换。

strftime()

strftime 允许我们从 Python datetime 对象创建人类可读的格式化字符串:

from datetime import datetime
# 获取当前 datetime 以进行格式化示例
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 20, 31, 19, 751479)
# 将 datetime 格式化为 日 - 月 (缩写)-年
now.strftime("%d-%b-%Y")
'23-Jul-2022'
# 将 datetime 格式化为 日 - 月 (数字)-年
now.strftime("%d-%m-%Y")
'23-07-2022'
# 将 datetime 格式化为 月/日/年
now.strftime("%m/%d/%Y")
'07/23/2022'
# 将 datetime 格式化为 月/日/年 - 时:分:秒
now.strftime("%b/%d/%Y - %H:%M:%S")
'Jul/23/2022 - 20:31:19'

传递给 strftime 的字符串可能看起来有点奇怪,但很容易理解其含义。例如,%m/%d/%Y 将返回用 / 分隔的月、日和年 (07/23/2022)。

strptime()

strptime 方法从字符串创建 datetime 对象。

此方法接受两个参数:

obj.strptime(datetime_string, format)
  • 一个代表 datetime 对象的字符串。
  • 与该字符串等效的 Python 格式代码。
from datetime import datetime

# 将字符串解析为 datetime 对象
datetime_str = '12-Jul-2023'
datetime.strptime(datetime_str, '%d-%b-%Y')
datetime.datetime(2023, 7, 12, 0, 0)
# 解析包含日期和时间的字符串
datetime_str = 'Jul/12/2023 - 14:38:37'
datetime.strptime(datetime_str, "%b/%d/%Y - %H:%M:%S")
datetime.datetime(2023, 7, 12, 14, 38, 37)

格式代码

指令含义示例
%a星期几的本地化缩写名称。Sun, Mon, …, Sat (en_US)
%A星期几的本地化全称。Sunday, Monday, …, Saturday (en_US)
%w星期几的十进制数,0 为星期日,6 为星期六。0, 1, …, 6
%d月中的第几天,零填充的十进制数。01, 02, …, 31
%b月份的本地化缩写名称。Jan, Feb, …, Dec (en_US)
%B月份的本地化全称。January, February, …, December (en_US)
%m月份的零填充十进制数。01, 02, …, 12
%y不带世纪的年份,零填充的十进制数。00, 01, …, 99
%Y带世纪的年份,十进制数。0001, 0002, …, 2013, 2014, …, 9998, 9999
%H小时(24 小时制),零填充的十进制数。00, 01, …, 23
%I小时(12 小时制),零填充的十进制数。01, 02, …, 12
%p本地化的 AM 或 PM 等效项。AM, PM (en_US)
%M分钟,零填充的十进制数。00, 01, …, 59
%S秒,零填充的十进制数。00, 01, …, 59
%f微秒,左侧零填充的十进制数。000000, 000001, …, 999999
%zUTC 偏移量,格式为 ±HHMM[SS[.ffffff]](如果对象是 naive 则为空字符串)。(empty), +0000, -0400, +1030, +063415, -030712.345216
%Z时区名称(如果对象是 naive 则为空字符串)。(empty), UTC, GMT
%j一年中的第几天,零填充的十进制数。001, 002, …, 366
%U一年中的周数(星期日为一周的第一天),零填充的十进制数。新年前的任何一天都被视为第 0 周。00, 01, …, 53
%W一年中的周数(星期一为一周的第一天),十进制数。新年前的任何一天都被视为第 0 周。00, 01, …, 53
%c本地化合适的日期和时间表示。Tue Aug 16 21:30:00 1988 (en_US)
%x本地化合适的日期表示。08/16/88 (None)
%X本地化合适的时间表示。21:30:00 (en_US)
%%字面上的 '%' 字符。%

timedelta()

timedelta 对象表示两个日期或时间之间的时间差。

from datetime import datetime

# 创建两个 datetime 对象
date_1 = datetime.strptime('12-Jul-2023', '%d-%b-%Y')
date_2 = datetime.strptime('01-Jan-2024', '%d-%b-%Y')

# 计算差异(返回 timedelta)
difference = date_2 - date_1
difference
datetime.timedelta(days=173)
# 从 timedelta 获取天数
difference.days
173

timedelta 可以向 datetime 对象添加 dayssecondsmicroseconds

from datetime import datetime, timedelta

# 获取当前 datetime 以进行 timedelta 操作
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 21, 25, 2, 341081)
# 向当前 datetime 添加 10 天和 15 秒
now + timedelta(days=10, seconds=15)
datetime.datetime(2022, 8, 2, 21, 25, 17, 341081)

并且可以从 datetime 对象中减去 dayssecondsmicroseconds

from datetime import datetime, timedelta

# 获取当前 datetime 以进行减法示例
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 21, 25, 2, 341081)
# 从当前 datetime 减去 10 天和 15 秒
now - timedelta(days=10, seconds=15)
datetime.datetime(2022, 7, 13, 21, 59, 41, 100883)

相关链接