Python datetime 模块

Python 的 datetime 模块是用于处理日期和时间的标准库模块。它提供了多种类和函数,可以帮助我们轻松地处理日期、时间、时间差等操作。无论是获取当前时间、格式化日期,还是计算时间差,datetime 模块都能胜任。

datetime 模块的核心类

datetime 模块中包含了以下几个核心类:

  • date 类 - date 类用于表示日期,包含年、月、日三个属性。

  • time 类 - time 类用于表示时间,包含时、分、秒、微秒等属性。

  • datetime 类 -datetime 类是 datetime 的结合体,可以同时表示日期和时间。

  • timedelta 类 - timedelta 类用于表示时间差,可以用于日期和时间的加减操作。


使用 datetime 模块

获取当前日期和时间

我们可以使用 datetime 类的 now() 方法来获取当前的日期和时间。

实例

from datetime import datetime

# 获取当前日期和时间
now = datetime.now()
print("当前时间:", now)

输出示例:

当前时间: 2025-04-22 14:30:45.123456

创建特定的日期和时间

我们可以通过 datetime 类的构造函数来创建特定的日期和时间。

实例

from datetime import datetime

# 创建特定的日期和时间
specific_time = datetime(2025, 4, 22, 15, 30, 0)
print("特定时间:", specific_time)

输出示例:

特定时间: 2025-04-22 15:30:00

格式化日期和时间

datetime 对象可以通过 strftime() 方法格式化为字符串。

实例

from datetime import datetime

# 获取当前时间
now = datetime.now()

# 格式化输出
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化时间:", formatted_time)

输出示例:

格式化时间: 2025-04-22 14:30:45

计算时间差

timedelta 类可以用于计算两个日期或时间之间的差值。

实例

from datetime import datetime, timedelta

# 获取当前时间
now = datetime.now()

# 计算 10 天后的时间
future_time = now + timedelta(days=10)
print("10 天后的时间:", future_time)

输出示例:

10 天后的时间: 2025-05-02 14:30:45.123456

常见应用场景

计算两个日期之间的天数

实例

from datetime import date

# 创建两个日期
date1 = date(2025, 4, 22)
date2 = date(2025, 5, 1)

# 计算天数差
delta = date2 - date1
print("两个日期之间的天数差:", delta.days)

输出示例:

两个日期之间的天数差: 9

处理时区

datetime 模块本身不直接支持时区操作,但可以通过 pytz 库来处理时区。

实例

from datetime import datetime
import pytz

# 获取当前时间并设置时区
now = datetime.now(pytz.timezone('Asia/Shanghai'))
print("上海当前时间:", now)

输出示例:

上海当前时间: 2025-04-22 14:30:45.123456+08:00

常用类、方法及属性

1. 核心类

说明 示例
datetime.date 日期类(年、月、日) date(2023, 5, 15)
datetime.time 时间类(时、分、秒、微秒) time(14, 30, 0)
datetime.datetime 日期时间类(包含日期和时间) datetime(2023, 5, 15, 14, 30)
datetime.timedelta 时间间隔类(用于日期/时间计算) timedelta(days=5)
datetime.tzinfo 时区信息基类(需子类化实现) 自定义时区类

2. date 对象常用方法/属性

方法/属性 说明 示例
date.today() 返回当前本地日期 date.today()date(2023, 5, 15)
date.fromisoformat(str) YYYY-MM-DD 字符串解析日期 date.fromisoformat("2023-05-15")
date.year 年份(只读) d.year2023
date.month 月份(1-12,只读) d.month5
date.day 日(1-31,只读) d.day15
date.weekday() 返回星期几(0=周一,6=周日) d.weekday()0
date.isoformat() 返回 YYYY-MM-DD 格式字符串 d.isoformat()"2023-05-15"
date.strftime(format) 自定义格式化输出 d.strftime("%Y/%m/%d")"2023/05/15"

3. time 对象常用方法/属性

方法/属性 说明 示例
time.hour 小时(0-23,只读) t.hour14
time.minute 分钟(0-59,只读) t.minute30
time.second 秒(0-59,只读) t.second0
time.microsecond 微秒(0-999999,只读) t.microsecond0
time.isoformat() 返回 HH:MM:SS.mmmmmm 格式字符串 t.isoformat()"14:30:00"
time.strftime(format) 自定义格式化输出 t.strftime("%H:%M")"14:30"

4. datetime 对象常用方法/属性

方法/属性 说明 示例
datetime.now() 返回当前本地日期时间 datetime.now()datetime(2023, 5, 15, 14, 30, 0)
datetime.utcnow() 返回当前 UTC 日期时间 datetime.utcnow()
datetime.fromtimestamp(ts) 从时间戳创建 datetime 对象 datetime.fromtimestamp(1684146600)
datetime.timestamp() 返回时间戳(浮点数秒) dt.timestamp()1684146600.0
datetime.date() 提取日期部分 dt.date()date(2023, 5, 15)
datetime.time() 提取时间部分 dt.time()time(14, 30)
datetime.year 年份(同 date dt.year2023
datetime.strftime(format) 自定义格式化输出 dt.strftime("%Y-%m-%d %H:%M")"2023-05-15 14:30"

5. timedelta 对象常用属性

属性 说明 示例
days 天数(可正可负) delta.days5
seconds 秒数(0-86399) delta.seconds3600(1小时)
microseconds 微秒数(0-999999) delta.microseconds0

6. 常用格式化符号(strftime

符号 说明 示例输出
%Y 四位年份 2023
%m 两位月份(01-12) 05
%d 两位日(01-31) 15
%H 24小时制小时(00-23) 14
%M 分钟(00-59) 30
%S 秒(00-59) 00
%A 完整星期名 Monday
%a 缩写星期名 Mon
%B 完整月份名 May
%b 缩写月份名 May

实例

1. 计算日期差

实例

from datetime import date, timedelta

d1 = date(2023, 5, 15)
d2 = date(2023, 6, 1)
delta = d2 - d1  # 返回 timedelta 对象
print(delta.days)  # 输出: 17

2. 时间加减

实例

from datetime import datetime, timedelta

now = datetime.now()
future = now + timedelta(days=3, hours=2)
print(future.strftime("%Y-%m-%d %H:%M"))

3. 时区转换(需安装 pytz)

实例

from datetime import datetime
import pytz

utc_time = datetime.utcnow().replace(tzinfo=pytz.utc)
beijing_time = utc_time.astimezone(pytz.timezone("Asia/Shanghai"))
print(beijing_time)

4. 解析字符串

实例

from datetime import datetime

dt = datetime.strptime("2023-05-15 14:30", "%Y-%m-%d %H:%M")
print(dt.year)  # 输出: 2023

注意事项

  1. 不可变性:所有 datetime 对象不可变,操作会返回新对象。

  2. 时区处理:原生 datetime 无时区支持,需用 pytz 或 Python 3.9+ 的 zoneinfo

  3. 性能:频繁创建对象可能影响性能,考虑重用或缓存。

  4. 边界检查:非法日期(如 date(2023, 2, 30))会触发 ValueError