杰瑞科技汇

Python datetime 时间如何格式化与计算?

datetime 模块的类

datetime 模块主要提供了以下几个类,理解它们的区别是关键:

Python datetime 时间如何格式化与计算?-图1
(图片来源网络,侵删)
类名 描述 示例
date 只存储日期(年、月、日),不包含时间信息。 2025-10-27
time 只存储时间(时、分、秒、微秒),不包含日期信息。 14:30:00
datetime 同时存储日期和时间信息,是最常用的类。 2025-10-27 14:30:00
timedelta 表示一个时间间隔或持续时间,用于日期时间的加减运算。 timedelta(days=7) (7天)
tzinfo 时区信息的抽象基类,用于处理不同时区的时间。

datetime 类:最常用的操作

1 获取当前时间

使用 datetime.now() 可以获取当前的本地时间。

from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前时间: {now}")
print(f"类型: {type(now)}")
# 输出可能类似于:
# 当前时间: 2025-10-27 15:30:45.123456
# 类型: <class 'datetime.datetime'>

2 创建特定时间的对象

你可以通过 datetime() 构造函数来创建一个你想要的 datetime 对象。

from datetime import datetime
# 创建一个特定的时间
# 格式: datetime(年, 月, 日, 时, 分, 秒, 微秒)
dt = datetime(2025, 10, 27, 10, 30, 0)
print(f"创建的时间: {dt}")
# 也可以只提供年月日,时分秒会默认为0
dt2 = datetime(2025, 1, 1)
print(f"只提供日期: {dt2}")

3 从字符串解析时间

在实际应用中,我们经常需要从字符串(如日志文件、用户输入)中解析出时间。strptime (string parse time) 是完成这个任务的利器。

from datetime import datetime
date_string = "2025-10-26 15:45:30"
# strptime 的第一个参数是字符串,第二个参数是格式化字符串
# %Y: 4位年份, %m: 2位月份, %d: 2位日期, %H: 24小时制, %M: 分钟, %S: 秒
dt = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(f"解析后的时间: {dt}")
print(f"类型: {type(dt)}")

常用格式化字符:

Python datetime 时间如何格式化与计算?-图2
(图片来源网络,侵删)
符号 含义 示例
%Y 4位年份 2025
%y 2位年份 23
%m 2位月份 (01-12) 10
%B 月份全称 October
%b 月份简称 Oct
%d 2位日期 (01-31) 27
%H 24小时制小时 (00-23) 14
%I 12小时制小时 (01-12) 02
%M 分钟 (00-59) 30
%S 秒 (00-59) 05
%A 星期全称 Friday
%a 星期简称 Fri
%p AM/PM PM

4 将 datetime 对象格式化为字符串

strptime 相对的是 strftime (string format time),它可以将 datetime 对象转换为你想要的字符串格式。

from datetime import datetime
now = datetime.now()
# 格式化为 YYYY-MM-DD HH:MM:SS
formatted_str1 = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化1: {formatted_str1}")
# 格式化为更友好的中文格式
formatted_str2 = now.strftime("%Y年%m月%d日 %H时%M分%S秒")
print(f"格式化2: {formatted_str2}")
# 格式化为 ISO 8601 标准格式
formatted_str3 = now.isoformat()
print(f"ISO格式: {formatted_str3}")

date 类的操作

date 对象只包含年月日,操作与 datetime 类似。

from datetime import date
# 获取当前日期
today = date.today()
print(f"今天日期: {today}")
# 创建特定日期
my_birthday = date(1990, 5, 20)
print(f"我的生日: {my_birthday}")
# 格式化日期
print(f"格式化: {today.strftime('%Y/%m/%d (%A)')}")
# 从字符串解析日期
date_str = "2025-12-25"
parsed_date = date.fromisoformat(date_str) # fromisoformat 是 ISO 格式 (YYYY-MM-DD) 的快捷方式
print(f"解析的日期: {parsed_date}")

timedelta 类:时间的加减

timedelta 用于表示两个时间点之间的差值,或者给一个时间点增加/减少一个时间间隔。

from datetime import datetime, timedelta
now = datetime.now()
# 计算未来3天后的时间
future_time = now + timedelta(days=3)
print(f"3天后: {future_time}")
# 计算2小时前的时间
past_time = now - timedelta(hours=2)
print(f"2小时前: {past_time}")
# 计算未来1周零2天3小时的时间
delta = timedelta(weeks=1, days=2, hours=3)
future_time2 = now + delta
print(f"1周2天3小时后: {future_time2}")
# 计算两个时间点的差值
time_difference = future_time - now
print(f"时间差: {time_difference}") # 结果是一个 timedelta 对象
print(f"时间差的天数: {time_difference.days}")
print(f"时间差的秒数: {time_difference.seconds}") # 注意:这不会包含天数的总秒数

时区处理 (Time Zones)

处理时区非常重要,尤其是在全球化的应用中,从 Python 3.9 开始,标准库 zoneinfo 是处理时区的推荐方式(更简单,无需安装第三方库)。

1 使用 zoneinfo (Python 3.9+)

from datetime import datetime
from zoneinfo import ZoneInfo # Python 3.9+ 内置
# 获取带时区的当前时间
# 'Asia/Shanghai' 是 IANA 时区数据库的时区名称
shanghai_time = datetime.now(ZoneInfo("Asia/Shanghai"))
new_york_time = datetime.now(ZoneInfo("America/New_York"))
print(f"上海时间: {shanghai_time}")
print(f"纽约时间: {new_york_time}")
# 将一个无时区的时间附加时区
naive_dt = datetime(2025, 10, 27, 10, 0)
aware_dt = naive_dt.replace(tzinfo=ZoneInfo("UTC"))
print(f"UTC时间: {aware_dt}")
# 时区转换
# 确保时间对象是 "aware" (有时区信息) 的
shanghai_to_utc = shanghai_time.astimezone(ZoneInfo("UTC"))
print(f"上海时间转UTC: {shanghai_to_utc}")

2 旧方法:pytz (Python 3.9 之前)

如果你使用的是旧版 Python,你可能需要安装并使用 pytz 库。

pip install pytz
from datetime import datetime
import pytz
# 获取带时区的当前时间
shanghai_time = datetime.now(pytz.timezone('Asia/Shanghai'))
print(f"上海时间 (pytz): {shanghai_time}")
# 时区转换
utc_time = shanghai_time.astimezone(pytz.UTC)
print(f"上海时间转UTC (pytz): {utc_time}")

常用技巧与最佳实践

1 比较 datetime 对象

datetime 对象可以直接进行比较,非常方便。

from datetime import datetime
dt1 = datetime(2025, 1, 1)
dt2 = datetime(2025, 1, 2)
print(f"dt1 < dt2 ? {dt1 < dt2}")  # True
print(f"dt1 == dt2 ? {dt1 == dt2}") # False

2 获取 datetime 对象的各个部分

from datetime import datetime
now = datetime.now()
print(f"年份: {now.year}")
print(f"月份: {now.month}")
print(f"日期: {now.day}")
print(f"小时: {now.hour}")
print(f"分钟: {now.minute}")
print(f"秒: {now.second}")
print(f"星期几 (0是周一): {now.weekday()}") # 返回 0-6
print(f"星期几 (1是周一): {now.isoweekday()}") # 返回 1-7

3 dateutil 库:更灵活的解析

datetime.strptime 要求字符串的格式必须完全匹配,如果字符串格式不固定,dateutil 库的 parser.parse 非常强大和智能。

pip install python-dateutil
from dateutil import parser
# 它能智能地解析各种格式的日期字符串
dt1 = parser.parse("Oct 27, 2025")
dt2 = parser.parse("2025/10/27")
dt3 = parser.parse("27th October, 23") # 甚至能处理 '23'
print(dt1)
print(dt2)
print(dt3)
任务 推荐方法 示例
获取当前时间 datetime.now() now = datetime.now()
创建特定时间 datetime() dt = datetime(2025, 10, 27, 10, 30)
字符串转时间 datetime.strptime() dt = datetime.strptime(s, "%Y-%m-%d")
时间转字符串 strftime() s = dt.strftime("%Y年%m月%d日")
时间加减 timedelta future_dt = now + timedelta(days=7)
获取当前日期 date.today() today = date.today()
处理时区 zoneinfo (Python 3.9+) dt = datetime.now(ZoneInfo("Asia/Shanghai"))
智能解析字符串 dateutil.parser.parse() dt = parser.parse("Oct 27, 2025")

掌握 datetime 模块是 Python 开发者的必备技能,希望这份详细的指南能帮助你!

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