杰瑞科技汇

Python datetime模块如何处理日期时间?

datetime 模块提供了用于处理日期和时间的类,它允许你轻松地操作、格式化和显示日期和时间信息。

Python datetime模块如何处理日期时间?-图1
(图片来源网络,侵删)

核心类

datetime 模块主要包含以下几个核心类,你需要先了解它们:

描述 示例
datetime 最常用的类,同时包含日期和时间信息。 2025-10-27 15:30:00
date 只包含日期信息(年、月、日)。 2025-10-27
time 只包含时间信息(时、分、秒、微秒)。 15:30:00
timedelta 表示两个日期或时间之间的时间差持续时间 timedelta(days=7)
tzinfo 时区信息的抽象基类,通常使用其子类 timezone UTC, +08:00

获取当前日期和时间

这是最常见的操作。

获取当前日期和时间 (datetime.now())

返回一个包含本地时区信息的 datetime 对象。

from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前日期和时间: {now}")
print(f"类型: {type(now)}")
# 输出结果示例 (取决于你运行代码的时间和地点):
# 当前日期和时间: 2025-10-27 10:30:55.123456
# 类型: <class 'datetime.datetime'>

获取当前日期 (date.today())

返回一个 date 对象,只包含年、月、日。

Python datetime模块如何处理日期时间?-图2
(图片来源网络,侵删)
from datetime import date
# 获取当前的日期
today = date.today()
print(f"当前日期: {today}")
print(f"类型: {type(today)}")
# 输出结果示例:
# 当前日期: 2025-10-27
# 类型: <class 'datetime.date'>

创建特定的日期和时间对象

你可以通过构造函数来创建一个特定的 datetimedatetime 对象。

创建 datetime 对象

格式: datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)

from datetime import datetime
# 创建一个特定的日期和时间
# 注意:月份是 1-12,小时是 0-23
dt = datetime(2025, 10, 27, 15, 30, 0)
print(f"自定义的日期和时间: {dt}")
# 输出: 自定义的日期和时间: 2025-10-27 15:30:00

创建 date 对象

格式: date(year, month, day)

from datetime import date
# 创建一个特定的日期
d = date(2025, 1, 1)
print(f"自定义的日期: {d}")
# 输出: 自定义的日期: 2025-01-01

创建 time 对象

格式: time(hour=0, minute=0, second=0, microsecond=0)

Python datetime模块如何处理日期时间?-图3
(图片来源网络,侵删)
from datetime import time
# 创建一个特定的时间
t = time(9, 45, 30)
print(f"自定义的时间: {t}")
# 输出: 自定义的时间: 09:45:30

格式化输出 (strftime)

strftime (string format time) 方法可以将 datetimedate 对象格式化为字符串。

格式代码 描述 示例
%Y 4位数的年份 2025
%y 2位数的年份 23
%m 2位数的月份 (01-12) 10
%B 月份的完整名称 October
%b 月份的缩写 Oct
%d 2位数的日 (01-31) 27
%A 星期的完整名称 Friday
%a 星期的缩写 Fri
%H 24小时制的小时 (00-23) 15
%I 12小时制的小时 (01-12) 03
%M 分钟 (00-59) 30
%S 秒 (00-59) 05
%p AM 或 PM PM
%f 微秒 (000000-999999) 123456
from datetime import datetime
dt = datetime(2025, 10, 27, 15, 30, 5)
# 格式化为常见的字符串格式
formatted_str1 = dt.strftime("%Y-%m-%d %H:%M:%S")
print(f"标准格式: {formatted_str1}")  # 输出: 标准格式: 2025-10-27 15:30:05
# 格式化为更友好的格式
formatted_str2 = dt.strftime("%B %d, %Y at %I:%M %p")
print(f"友好格式: {formatted_str2}")  # 输出: 友好格式: October 27, 2025 at 03:30 PM
# 中文格式
formatted_str3 = dt.strftime("%Y年%m月%d日 %H时%M分")
print(f"中文格式: {formatted_str3}")  # 输出: 中文格式: 2025年10月27日 15时30分

解析字符串为日期时间 (strptime)

strptime (string parse time) 是 strftime 的逆操作,它可以将符合特定格式的字符串解析为 datetime 对象。

from datetime import datetime
date_string = "2025-10-27 15:30:00"
# 将字符串解析为 datetime 对象
# 第一个参数是字符串,第二个参数是字符串的格式
dt_object = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"解析后的对象: {dt_object}")
print(f"类型: {type(dt_object)}")
# 输出:
# 解析后的对象: 2025-10-27 15:30:00
# 类型: <class 'datetime.datetime'>

注意: strptime 的格式代码必须和字符串的格式完全匹配,否则会抛出 ValueError


日期和时间的计算 (timedelta)

timedelta 对象用于表示两个日期或时间之间的差值,并可以用来进行加减运算。

获取时间差

from datetime import datetime, timedelta
now = datetime.now()
# 创建一个7天后的时间点
future_time = now + timedelta(days=7)
# 创建一个2小时前的时间点
past_time = now - timedelta(hours=2)
print(f" {now}")
print(f"7天后: {future_time}")
print(f"2小时前: {past_time}")

计算两个日期之间的差值

from datetime import datetime
# 定义两个日期
date1 = datetime(2025, 1, 1)
date2 = datetime(2025, 10, 27)
# 计算差值,结果是一个 timedelta 对象
delta = date2 - date1
print(f"日期差: {delta}")
print(f"相差的天数: {delta.days}")
print(f"相差的秒数: {delta.total_seconds()}") # total_seconds() 包含所有天数换算成的秒数
# 输出:
# 日期差: 301 days, 0:00:00
# 相差的天数: 301
# 相差的秒数: 26006400.0

访问和修改组件

datetime 对象的各个组件(年、月、日等)可以通过属性来访问,并且是不可变的(immutable),如果你想修改,需要创建一个新的对象。

from datetime import datetime
dt = datetime(2025, 10, 27, 15, 30, 0)
# 访问组件
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日: {dt.day}")
print(f"小时: {dt.hour}")
# 输出:
# 年份: 2025
# 月份: 10
# 日: 27
# 小时: 15
# 修改组件 (需要创建新对象)
# 将年份改为2025
new_dt = dt.replace(year=2025)
print(f"修改后的日期: {new_dt}")
# 输出: 修改后的日期: 2025-10-27 15:30:00

时区处理 (timezone)

datetime 模块也支持时区处理,这对于处理跨时区的应用非常重要。

from datetime import datetime, timezone, timedelta
# 获取当前带时区的 UTC 时间
utc_now = datetime.now(timezone.utc)
print(f"UTC 时间: {utc_now}")
# 创建一个带有时区信息的 datetime 对象
# 创建一个东八区 (UTC+8) 的时区
tz_eastern = timezone(timedelta(hours=8))
dt_with_tz = datetime(2025, 10, 27, 15, 30, 0, tzinfo=tz_eastern)
print(f"东八区时间: {dt_with_tz}")
# 将一个无时区的 datetime 对象转换为有时区的对象
# (推荐使用 astimezone)
naive_dt = datetime(2025, 10, 27, 15, 30, 0)
aware_dt = naive_dt.astimezone(timezone.utc)
print(f"无时区 -> UTC: {aware_dt}")

重要提示:

  • “Naive” (天真)datetime 对象不包含时区信息。
  • “Aware” (感知)datetime 对象包含时区信息。
  • 在处理跨时区数据时,强烈建议始终使用 Aware 对象,以避免混淆和错误。

datetime 模块是 Python 中处理日期和时间的基础,掌握以下核心操作就足以应对绝大多数场景:

  1. 获取时间: datetime.now(), date.today()
  2. 创建时间: datetime(...), date(...)
  3. 格式化输出: strftime() (对象 -> 字符串)
  4. 解析字符串: strptime() (字符串 -> 对象)
  5. 时间计算: 使用 timedelta 进行加减
  6. 访问属性: .year, .month, .day
  7. 修改属性: .replace() 方法 (创建新对象)
  8. 时区: 使用 timezoneastimezone() 处理时区问题,尽量使用 Aware 对象。
分享:
扫描分享到社交APP
上一篇
下一篇