一、datetime模块概述
datetime 是 Python 标准库中用于处理日期和时间的模块。它提供了多种类和函数,可以创建、操作、格式化日期和时间数据。在实际开发中,无论是记录日志、计算时间差、处理用户生日,还是分析时间序列数据,都离不开这个模块。
from datetime import datetime
# 获取当前日期和时间
now = datetime.now()
print(now) # 2025-01-15 14:30:25.123456
print(type(now)) # <class 'datetime.datetime'>
二、datetime模块的核心类
| | |
date | | |
time | | |
datetime | | |
timedelta | | |
tzinfo | | |
三、date类——处理日期
3.1 创建date对象
from datetime import date
# 创建指定日期
d1 = date(2025, 1, 15)
print(d1) # 2025-01-15
# 获取当前日期
today = date.today()
print(today) # 当前系统日期
3.2 获取日期属性
d = date(2025, 1, 15)
print(d.year) # 2025
print(d.month) # 1
print(d.day) # 15
# 获取星期几(0=周一,6=周日)
print(d.weekday()) # 2(周三)
print(d.isoweekday()) # 3(周三,1=周一,7=周日)
3.3 日期运算
from datetime import date, timedelta
d = date(2025, 1, 15)
# 日期加减
d_next = d + timedelta(days=7)
print(d_next) # 2025-01-22
d_prev = d - timedelta(days=3)
print(d_prev) # 2025-01-12
# 计算日期差
d1 = date(2025, 1, 1)
d2 = date(2025, 1, 15)
diff = d2 - d1
print(diff.days) # 14
3.4 日期比较
d1 = date(2025, 1, 1)
d2 = date(2025, 1, 15)
print(d1 < d2) # True
print(d1 == d2) # False
四、time类——处理时间
4.1 创建time对象
from datetime import time
# 创建指定时间
t = time(14, 30, 25) # 14:30:25
print(t) # 14:30:25
# 带微秒
t2 = time(14, 30, 25, 500000)
print(t2) # 14:30:25.500000
4.2 获取时间属性
t = time(14, 30, 25, 500000)
print(t.hour) # 14
print(t.minute) # 30
print(t.second) # 25
print(t.microsecond) # 500000
五、datetime类——处理日期和时间
5.1 创建datetime对象
from datetime import datetime
# 创建指定日期时间
dt = datetime(2025, 1, 15, 14, 30, 25)
print(dt) # 2025-01-15 14:30:25
# 获取当前日期时间
now = datetime.now()
print(now) # 2025-01-15 14:30:25.123456
# 获取当前UTC时间
utc_now = datetime.utcnow()
print(utc_now)
# 从时间戳创建
timestamp = 1705300225
dt_from_ts = datetime.fromtimestamp(timestamp)
print(dt_from_ts)
# 从字符串解析
dt_from_str = datetime.strptime("2025-01-15 14:30:25", "%Y-%m-%d %H:%M:%S")
print(dt_from_str)
5.2 获取datetime属性
dt = datetime(2025, 1, 15, 14, 30, 25)
print(dt.year) # 2025
print(dt.month) # 1
print(dt.day) # 15
print(dt.hour) # 14
print(dt.minute) # 30
print(dt.second) # 25
print(dt.weekday()) # 2(周三)
5.3 datetime运算
from datetime import datetime, timedelta
dt = datetime(2025, 1, 15, 14, 30, 25)
# 加减时间
dt_next = dt + timedelta(days=7, hours=2)
print(dt_next) # 2025-01-22 16:30:25
dt_prev = dt - timedelta(days=3)
print(dt_prev) # 2025-01-12 14:30:25
# 计算时间差
dt1 = datetime(2025, 1, 1, 0, 0, 0)
dt2 = datetime(2025, 1, 15, 14, 30, 25)
diff = dt2 - dt1
print(diff.days) # 14
print(diff.seconds) # 52225(14*3600 + 30*60 + 25)
print(diff.total_seconds()) # 1252225.0
六、timedelta类——时间间隔
6.1 创建timedelta
from datetime import timedelta
# 各种创建方式
td1 = timedelta(days=5)
td2 = timedelta(hours=10)
td3 = timedelta(minutes=30)
td4 = timedelta(seconds=45)
td5 = timedelta(weeks=2) # 14天
td6 = timedelta(days=1, hours=2, minutes=30)
print(td1) # 5 days, 0:00:00
print(td5) # 14 days, 0:00:00
6.2 timedelta属性
td = timedelta(days=5, hours=10, minutes=30, seconds=15)
print(td.days) # 5
print(td.seconds) # 37815(10*3600 + 30*60 + 15)
print(td.total_seconds()) # 469815.0
七、格式化与解析
7.1 strftime——将datetime转为字符串
from datetime import datetime
now = datetime.now()
# 常用格式
print(now.strftime("%Y-%m-%d")) # 2025-01-15
print(now.strftime("%Y年%m月%d日")) # 2025年01月15日
print(now.strftime("%H:%M:%S")) # 14:30:25
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 2025-01-15 14:30:25
print(now.strftime("%A")) # Wednesday
print(now.strftime("%B")) # January
常用格式化代码:
| | |
%Y | | |
%y | | |
%m | | |
%d | | |
%H | | |
%I | | |
%M | | |
%S | | |
%f | | |
%p | | |
%A | | |
%a | | |
%B | | |
%b | | |
%j | | |
%w | | |
%U | | |
7.2 strptime——将字符串解析为datetime
from datetime import datetime
# 解析常见格式
dt1 = datetime.strptime("2025-01-15", "%Y-%m-%d")
print(dt1) # 2025-01-15 00:00:00
dt2 = datetime.strptime("2025-01-15 14:30:25", "%Y-%m-%d %H:%M:%S")
print(dt2) # 2025-01-15 14:30:25
dt3 = datetime.strptime("15/Jan/2025:14:30:25", "%d/%b/%Y:%H:%M:%S")
print(dt3) # 2025-01-15 14:30:25
7.3 isoformat和fromisoformat
from datetime import datetime
# ISO 8601格式
now = datetime.now()
iso_str = now.isoformat()
print(iso_str) # 2025-01-15T14:30:25.123456
# 从ISO格式解析
dt = datetime.fromisoformat(iso_str)
print(dt)
八、实战案例
8.1 计算年龄
from datetime import date
defcalculate_age(birth_date):
today = date.today()
age = today.year - birth_date.year
# 检查是否还没过生日
if (today.month, today.day) < (birth_date.month, birth_date.day):
age -= 1
return age
birth = date(1990, 5, 20)
print(f"年龄: {calculate_age(birth)} 岁")
8.2 获取某个月的天数
from datetime import date
defdays_in_month(year, month):
if month == 12:
next_month = date(year + 1, 1, 1)
else:
next_month = date(year, month + 1, 1)
first_day = date(year, month, 1)
return (next_month - first_day).days
print(days_in_month(2024, 2)) # 29(闰年)
print(days_in_month(2025, 2)) # 28
8.3 生成日期范围
from datetime import date, timedelta
defdate_range(start_date, end_date):
"""生成从 start_date 到 end_date 的所有日期"""
current = start_date
while current <= end_date:
yield current
current += timedelta(days=1)
start = date(2025, 1, 1)
end = date(2025, 1, 10)
for d in date_range(start, end):
print(d)
8.4 计算两个日期之间的工作日
from datetime import date, timedelta
defworkdays_between(start_date, end_date):
"""计算两个日期之间的工作日数量(周一至周五)"""
days = 0
current = start_date
while current <= end_date:
if current.weekday() < 5: # 0=周一, 4=周五
days += 1
current += timedelta(days=1)
return days
start = date(2025, 1, 1)
end = date(2025, 1, 31)
print(f"工作日: {workdays_between(start, end)} 天")
8.5 时间戳转换
from datetime import datetime
# datetime 转时间戳
dt = datetime(2025, 1, 15, 14, 30, 25)
timestamp = dt.timestamp()
print(timestamp) # 1705300225.0
# 时间戳转 datetime
dt2 = datetime.fromtimestamp(timestamp)
print(dt2) # 2025-01-15 14:30:25
8.6 定时任务(每隔N秒执行)
import time
from datetime import datetime
defschedule_task(interval_seconds, duration_seconds):
"""每隔 interval_seconds 秒执行一次,持续 duration_seconds 秒"""
start_time = datetime.now()
end_time = start_time + timedelta(seconds=duration_seconds)
while datetime.now() < end_time:
print(f"执行任务 at {datetime.now().strftime('%H:%M:%S')}")
time.sleep(interval_seconds)
# 每隔2秒执行,持续10秒
# schedule_task(2, 10)
九、常见错误与注意事项
- 1. 月份和日期从1开始:
datetime(2025, 1, 15) 中的月份和日期都是从1开始的,不是0。 - 2. strptime格式必须完全匹配:
# 错误:格式不匹配
# datetime.strptime("2025-01-15", "%Y/%m/%d") # ValueError
# 正确
datetime.strptime("2025-01-15", "%Y-%m-%d")
- 3. timedelta不能用于月份和年份:
timedelta 只支持天、秒、微秒,加减月份应使用 dateutil.relativedelta。 - 4. 时区问题:
datetime.now() 返回本地时间,datetime.utcnow() 返回UTC时间。处理时区应考虑使用 pytz 或 zoneinfo(Python 3.9+)。 - 5. datetime是不可变对象:所有操作都会返回新的对象,不会修改原对象。
十、总结
| | |
date | | today() |
time | | hour |
datetime | | now() |
timedelta | | days, seconds, total_seconds() |
核心要点:
- • 使用
datetime.now() 获取当前时间。 - • 使用
strftime() 将时间格式化为字符串。 - • 使用
strptime() 将字符串解析为时间。 - • 注意时区问题,跨时区场景使用
pytz 或 zoneinfo。
掌握 datetime 模块,是处理日期时间相关需求的基础,无论是简单的日志记录还是复杂的时间计算,都能轻松应对。