杰瑞科技汇

Python datetime 类型如何高效处理时间?

datetime 模块 vs. datetime

要分清两个概念:

Python datetime 类型如何高效处理时间?-图1
(图片来源网络,侵删)
  1. datetime 模块:这是 Python 标准库中的一个模块,它包含了处理日期和时间的各种类和函数,你可以通过 import datetime 来导入它。
  2. datetime:这是 datetime 模块中最核心、最常用的一个类,它同时包含了日期(年、月、日)和时间(时、分、秒、微秒)信息。

我们使用 from datetime import datetime 来直接导入 datetime 类,这样写起来更方便。


创建 datetime 对象

创建 datetime 对象主要有两种方式。

使用 datetime() 构造函数

你可以直接传入年、月、日、时、分、秒、微秒等参数来创建一个具体的 datetime 对象。

from datetime import datetime
# 创建一个 datetime 对象
# 格式: datetime(年, 月, 日, 时, 分, 秒, 微秒)
dt = datetime(2025, 10, 26, 10, 30, 0, 500000)
print(dt)
# 输出: 2025-10-26 10:30:00.500000
# 如果不提供时间部分,默认为 00:00:00
dt_date_only = datetime(2025, 10, 26)
print(dt_date_only)
# 输出: 2025-10-26 00:00:00

从字符串解析(最常用)

当你从文件、数据库或用户输入中获取日期时间字符串时,需要将其解析为 datetime 对象才能进行操作,这需要用到 strptime() 方法(parse time 的缩写)。

Python datetime 类型如何高效处理时间?-图2
(图片来源网络,侵删)
from datetime import datetime
# 定义一个日期时间字符串
date_string = "2025-10-26 15:45:30"
# 使用 strptime 解析字符串
# 第一个参数是字符串,第二个参数是格式化代码
dt_from_string = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(dt_from_string)
# 输出: 2025-10-26 15:45:30
# 其他格式的例子
dt_iso = datetime.fromisoformat("20251026T154530") # ISO 8601 格式
print(dt_iso)
# 输出: 2025-10-26 15:45:30

获取当前时间

使用 datetime.now() 可以获取当前的本地时间,使用 datetime.utcnow() 可以获取当前的 UTC(协调世界时)时间。

from datetime import datetime
# 获取当前本地时间
now = datetime.now()
print(f"当前本地时间: {now}")
# 输出可能为: 当前本地时间: 2025-10-27 10:05:22.123456
# 获取当前 UTC 时间
now_utc = datetime.utcnow()
print(f"当前 UTC 时间: {now_utc}")
# 输出可能为: 当前 UTC 时间: 2025-10-27 02:05:22.123456 (根据时区不同)

datetime 对象的属性

一旦你有了 datetime 对象,就可以轻松访问它的各个组成部分。

from datetime import datetime
dt = datetime(2025, 10, 26, 15, 45, 30, 123456)
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日期: {dt.day}")
print(f"小时: {dt.hour}")
print(f"分钟: {dt.minute}")
print(f"秒: {dt.second}")
print(f"微秒: {dt.microsecond}")
print(f"星期几 (0是周一, 6是周日): {dt.weekday()}") # 注意:weekday() 返回 0-6
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}") # isoweekday() 返回 1-7
print(f"ISO 8601 格式的年份和周数: {dt.isocalendar()}") # 返回一个元组 (year, week, weekday)

格式化输出(strftime

strftime (format time) 方法可以将 datetime 对象格式化为你想要的字符串。

from datetime import datetime
dt = datetime(2025, 10, 26, 15, 45, 30)
# 常用格式化代码
# %Y: 四位数年份 (e.g., 2025)
# %m: 两位数月份 (01-12)
# %d: 两位数日期 (01-31)
# %H: 24小时制小时 (00-23)
# %I: 12小时制小时 (01-12)
# %M: 两位数分钟 (00-59)
# %S: 两位数秒 (00-59)
# %A: 星期全名 (e.g., Thursday)
# %a: 星期缩写 (e.g., Thu)
# %B: 月份全名 (e.g., October)
# %b: 月份缩写 (e.g., Oct)
# 格式化为常见的字符串
formatted_date_1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date_1)
# 输出: 2025-10-26 15:45:30
formatted_date_2 = dt.strftime("%Y年%m月%d日 %A")
print(formatted_date_2)
# 输出: 2025年10月26日 Thursday

datetime 对象的运算

datetime 对象支持与 timedelta 对象的加减运算,这是进行时间计算的关键。

timedelta

timedelta 表示一个时间差或持续时间,你可以创建代表天、秒、毫秒、微秒、分钟、小时、周的 timedelta 对象。

from datetime import datetime, timedelta
now = datetime.now()
# 创建一个时间差对象
# timedelta(天, 秒, 微秒, 毫秒, 分钟, 小时, 周)
delta = timedelta(days=5, hours=3, minutes=30)
# 计算 5天3小时30分钟后的时间
future_time = now + delta
print(f"未来时间: {future_time}")
# 计算 10天前的时间
past_time = now - timedelta(weeks=2)
print(f"过去时间: {past_time}")
# 两个 datetime 对象相减,得到一个 timedelta 对象
time_diff = future_time - past_time
print(f"时间差: {time_diff}")
print(f"时间差的天数: {time_diff.days}")
print(f"时间差的秒数: {time_diff.seconds}") # 注意:只返回剩余部分的秒数,不包括整天对应的秒数

与时间戳的转换

时间戳(Timestamp)是指从 1970年1月1日 00:00:00 UTC(称为“纪元”)开始经过的总秒数。

from datetime import datetime
# 获取当前时间戳
timestamp = datetime.now().timestamp()
print(f"当前时间戳: {timestamp}")
# 将时间戳转换为 datetime 对象
# datetime.fromtimestamp() 返回本地时间
dt_from_timestamp = datetime.fromtimestamp(timestamp)
print(f"从时间戳转换来的本地时间: {dt_from_timestamp}")
# 使用 utcfromtimestamp() 获取 UTC 时间
dt_utc_from_timestamp = datetime.utcfromtimestamp(timestamp)
print(f"从时间戳转换来的 UTC 时间: {dt_utc_from_timestamp}")

时区处理(重要)

datetime 模块本身不包含时区信息的对象,但 datetime 模块提供了一个名为 timezone 的类来处理时区,更常用的是第三方库 pytz 或 Python 3.9+ 内置的 zoneinfo

使用 datetime.timezone (简单时区)

from datetime import datetime, timezone, timedelta
# 创建一个带有时区的 datetime 对象
# 使用 timezone(timedelta(hours=...)) 来创建一个固定的时区偏移
tz_utc_plus_8 = timezone(timedelta(hours=8)) # 北京时间 (UTC+8)
# 为当前时间指定时区
now_with_tz = datetime.now(tz_utc_plus_8)
print(f"带有时区的当前时间: {now_with_tz}")
# 输出可能为: 2025-10-27 18:05:22.123456+08:00

使用 zoneinfo (Python 3.9+ 推荐方式)

zoneinfo 是 Python 3.9 引入的官方时区库,使用 IANA 时区数据库(如 "Asia/Shanghai", "America/New_York"),比 pytz 更现代化。

# 需要 Python 3.9+
from datetime import datetime
from zoneinfo import ZoneInfo
# 创建一个带有时区的 datetime 对象
tz_sh = ZoneInfo("Asia/Shanghai") # 上海时区 (UTC+8)
tz_ny = ZoneInfo("America/New_York") # 纽约时区 (UTC-4 或 UTC-5)
now_sh = datetime.now(tz_sh)
print(f"上海当前时间: {now_sh}")
now_ny = datetime.now(tz_ny)
print(f"纽约当前时间: {now_ny}")
# 时区转换
# 将上海时间转换为纽约时间
ny_time_from_sh = now_sh.astimezone(tz_ny)
print(f"上海时间转换到纽约时区: {ny_time_from_sh}")

总结表格

功能 方法/函数 描述 示例
创建对象 datetime(年, 月, 日, ...) 直接构造一个 datetime 对象。 datetime(2025, 10, 26)
datetime.strptime(s, fmt) 从字符串解析 datetime 对象。 datetime.strptime("2025-10-26", "%Y-%m-%d")
datetime.now() 获取当前本地时间的 datetime 对象。 datetime.now()
访问属性 .year, .month, .day 获取 datetime 对象的年、月、日等属性。 dt.year
格式化输出 strftime(fmt) datetime 对象格式化为字符串。 dt.strftime("%Y-%m-%d")
时间计算 timedelta timedelta 对象进行加减运算。 now + timedelta(days=1)
时间戳转换 .timestamp() datetime 对象转换为时间戳。 dt.timestamp()
datetime.fromtimestamp(ts) 将时间戳转换为 datetime 对象(本地时间)。 datetime.fromtimestamp(1698370000)
时区处理 datetime.now(tz=ZoneInfo(...)) 获取带有时区的当前时间。 datetime.now(tz=ZoneInfo("Asia/Shanghai"))
.astimezone(tz) datetime 对象转换到指定时区。 dt.astimezone(ZoneInfo("UTC"))

希望这份详细的讲解能帮助你完全掌握 Python 的 datetime 类型!

分享:
扫描分享到社交APP
上一篇
下一篇