第93集:datetime模块详解

学习目标

  1. 理解datetime模块的作用和重要性
  2. 掌握datetime模块的核心类和对象
  3. 学会使用datetime模块处理日期和时间
  4. 了解datetime模块在实际开发中的应用场景

课程内容

1. datetime模块简介

datetime模块是Python标准库中用于处理日期和时间的模块,提供了丰富的日期时间操作功能。它包含多个类,用于表示日期、时间、日期时间、时间间隔等。

主要类:

  • date:表示日期(年、月、日)
  • time:表示时间(时、分、秒、微秒)
  • datetime:表示日期和时间
  • timedelta:表示时间间隔
  • tzinfo:表示时区信息

2. date类 - 日期处理

2.1 创建date对象

示例:

from datetime import date

# 获取当前日期
today = date.today()
print(f"今天: {today}")

# 创建指定日期
d = date(2024, 1, 1)
print(f"指定日期: {d}")

# 从时间戳创建
d2 = date.fromtimestamp(1609459200)
print(f"从时间戳创建: {d2}")

2.2 date对象属性

示例:

from datetime import date

d = date(2024, 1, 1)

print(f"年份: {d.year}")
print(f"月份: {d.month}")
print(f"日期: {d.day}")

2.3 date对象方法

常用方法:

  • today():获取当前日期
  • weekday():返回星期几(0-6,0表示周一)
  • isoweekday():返回ISO星期几(1-7,1表示周一)
  • strftime():格式化日期
  • replace():替换日期部分

示例:

from datetime import date

d = date(2024, 1, 1)

print(f"星期几(weekday): {d.weekday()}")
print(f"星期几(isoweekday): {d.isoweekday()}")

# 格式化日期
print(f"格式化: {d.strftime('%Y-%m-%d')}")
print(f"中文格式: {d.strftime('%Y年%m月%d日')}")

# 替换日期
d2 = d.replace(year=2025)
print(f"替换年份: {d2}")

3. time类 - 时间处理

3.1 创建time对象

示例:

from datetime import time

# 创建时间对象
t = time(14, 30, 45)
print(f"时间: {t}")

# 创建时间对象(带微秒)
t2 = time(14, 30, 45, 123456)
print(f"带微秒的时间: {t2}")

# 创建时间对象(部分参数)
t3 = time(14, 30)
print(f"部分参数: {t3}")

3.2 time对象属性

示例:

from datetime import time

t = time(14, 30, 45, 123456)

print(f"小时: {t.hour}")
print(f"分钟: {t.minute}")
print(f"秒: {t.second}")
print(f"微秒: {t.microsecond}")

3.3 time对象方法

常用方法:

  • strftime():格式化时间
  • replace():替换时间部分

示例:

from datetime import time

t = time(14, 30, 45)

# 格式化时间
print(f"格式化: {t.strftime('%H:%M:%S')}")
print(f"12小时制: {t.strftime('%I:%M:%S %p')}")

# 替换时间
t2 = t.replace(hour=15)
print(f"替换小时: {t2}")

4. datetime类 - 日期时间处理

4.1 创建datetime对象

示例:

from datetime import datetime

# 获取当前日期时间
now = datetime.now()
print(f"现在: {now}")

# 创建指定日期时间
dt = datetime(2024, 1, 1, 14, 30, 45)
print(f"指定日期时间: {dt}")

# 从时间戳创建
dt2 = datetime.fromtimestamp(1609459200)
print(f"从时间戳创建: {dt2}")

# 从字符串创建
dt3 = datetime.strptime('2024-01-01 14:30:45', '%Y-%m-%d %H:%M:%S')
print(f"从字符串创建: {dt3}")

4.2 datetime对象属性

示例:

from datetime import datetime

dt = datetime(2024, 1, 1, 14, 30, 45, 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}")

4.3 datetime对象方法

常用方法:

  • now():获取当前日期时间
  • today():获取当前日期时间
  • strftime():格式化日期时间
  • strptime():从字符串解析日期时间
  • date():获取date对象
  • time():获取time对象
  • timestamp():获取时间戳

示例:

from datetime import datetime

dt = datetime(2024, 1, 1, 14, 30, 45)

# 获取date和time对象
print(f"日期部分: {dt.date()}")
print(f"时间部分: {dt.time()}")

# 获取时间戳
print(f"时间戳: {dt.timestamp()}")

# 格式化日期时间
print(f"格式化: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"中文格式: {dt.strftime('%Y年%m月%d日 %H时%M分%S秒')}")

# 替换日期时间
dt2 = dt.replace(year=2025, hour=15)
print(f"替换后: {dt2}")

5. timedelta类 - 时间间隔

5.1 创建timedelta对象

示例:

from datetime import timedelta

# 创建时间间隔
td = timedelta(days=7, hours=12, minutes=30)
print(f"时间间隔: {td}")

# 创建时间间隔(秒)
td2 = timedelta(seconds=3600)
print(f"1小时: {td2}")

# 创建时间间隔(周)
td3 = timedelta(weeks=2)
print(f"2周: {td3}")

5.2 timedelta对象属性

示例:

from datetime import timedelta

td = timedelta(days=7, hours=12, minutes=30, seconds=45)

print(f"天数: {td.days}")
print(f"秒数: {td.seconds}")
print(f"总秒数: {td.total_seconds()}")

5.3 timedelta运算

示例:

from datetime import datetime, timedelta

now = datetime.now()

# 加上时间间隔
future = now + timedelta(days=7)
print(f"7天后: {future}")

# 减去时间间隔
past = now - timedelta(days=7)
print(f"7天前: {past}")

# 计算时间差
dt1 = datetime(2024, 1, 1)
dt2 = datetime(2024, 1, 10)
diff = dt2 - dt1
print(f"时间差: {diff}")
print(f"天数: {diff.days}")

6. 日期时间格式化

6.1 strftime() - 格式化输出

常用格式化符号:

  • %Y:四位年份
  • %m:月份(01-12)
  • %d:日期(01-31)
  • %H:小时(00-23)
  • %M:分钟(00-59)
  • %S:秒(00-59)
  • %f:微秒
  • %A:星期名称
  • %a:星期缩写
  • %B:月份名称
  • %b:月份缩写
  • %p:AM/PM

示例:

from datetime import datetime

dt = datetime(2024, 1, 1, 14, 30, 45)

# 常用格式
print(f"标准格式: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"斜杠格式: {dt.strftime('%Y/%m/%d %H:%M:%S')}")
print(f"中文格式: {dt.strftime('%Y年%m月%d日 %H时%M分%S秒')}")
print(f"12小时制: {dt.strftime('%Y-%m-%d %I:%M:%S %p')}")
print(f"完整格式: {dt.strftime('%Y-%m-%d %H:%M:%S.%f')}")
print(f"星期格式: {dt.strftime('%Y-%m-%d %A')}")

6.2 strptime() - 字符串解析

示例:

from datetime import datetime

# 解析不同格式的字符串
dt1 = datetime.strptime('2024-01-01 14:30:45', '%Y-%m-%d %H:%M:%S')
print(f"标准格式: {dt1}")

dt2 = datetime.strptime('2024/01/01 14:30:45', '%Y/%m/%d %H:%M:%S')
print(f"斜杠格式: {dt2}")

dt3 = datetime.strptime('2024年01月01日 14时30分45秒', '%Y年%m月%d日 %H时%M分%S秒')
print(f"中文格式: {dt3}")

dt4 = datetime.strptime('Jan 1, 2024 2:30 PM', '%b %d, %Y %I:%M %p')
print(f"英文格式: {dt4}")

7. 时区处理

7.1 时区信息

示例:

from datetime import datetime, timezone, timedelta

# 创建时区
tz = timezone(timedelta(hours=8))
print(f"时区: {tz}")

# 创建带时区的datetime
dt = datetime(2024, 1, 1, 14, 30, 45, tzinfo=tz)
print(f"带时区的datetime: {dt}")

# 获取UTC时间
utc_dt = datetime.now(timezone.utc)
print(f"UTC时间: {utc_dt}")

7.2 时区转换

示例:

from datetime import datetime, timezone, timedelta

# 创建UTC时间
utc_dt = datetime(2024, 1, 1, 6, 30, 45, tzinfo=timezone.utc)
print(f"UTC时间: {utc_dt}")

# 转换为东八区时间
tz = timezone(timedelta(hours=8))
local_dt = utc_dt.astimezone(tz)
print(f"东八区时间: {local_dt}")

8. 实际应用场景

8.1 计算日期差

示例:

from datetime import datetime

def days_between(date1, date2):
    dt1 = datetime.strptime(date1, '%Y-%m-%d')
    dt2 = datetime.strptime(date2, '%Y-%m-%d')
    diff = dt2 - dt1
    return abs(diff.days)

# 计算两个日期之间的天数
days = days_between('2024-01-01', '2024-12-31')
print(f"天数: {days}")

8.2 生成日期序列

示例:

from datetime import datetime, timedelta

def date_range(start_date, end_date):
    start = datetime.strptime(start_date, '%Y-%m-%d')
    end = datetime.strptime(end_date, '%Y-%m-%d')
    
    dates = []
    current = start
    while current <= end:
        dates.append(current.strftime('%Y-%m-%d'))
        current += timedelta(days=1)
    
    return dates

# 生成日期序列
dates = date_range('2024-01-01', '2024-01-10')
print(f"日期序列: {dates}")

8.3 计算年龄

示例:

from datetime import date

def calculate_age(birth_date):
    today = date.today()
    birth = datetime.strptime(birth_date, '%Y-%m-%d').date()
    
    age = today.year - birth.year
    if (today.month, today.day) < (birth.month, birth.day):
        age -= 1
    
    return age

# 计算年龄
age = calculate_age('1990-01-01')
print(f"年龄: {age}岁")

8.4 判断工作日

示例:

from datetime import datetime

def is_weekday(date_str):
    dt = datetime.strptime(date_str, '%Y-%m-%d')
    return dt.weekday() < 5

# 判断是否为工作日
print(f"2024-01-01是工作日: {is_weekday('2024-01-01')}")
print(f"2024-01-08是工作日: {is_weekday('2024-01-08')}")

8.5 计算截止日期

示例:

from datetime import datetime, timedelta

def deadline(start_date, days):
    start = datetime.strptime(start_date, '%Y-%m-%d')
    end = start + timedelta(days=days)
    return end.strftime('%Y-%m-%d')

# 计算截止日期
end_date = deadline('2024-01-01', 30)
print(f"截止日期: {end_date}")

9. 最佳实践

  1. 使用datetime模块处理日期时间

    • 避免使用字符串处理日期
    • 使用datetime对象进行计算
    • 使用strftime和strptime进行格式化
  2. 处理时区

    • 明确时区信息
    • 使用UTC作为标准
    • 注意时区转换
  3. 处理异常

    • 捕获日期解析异常
    • 验证日期范围
    • 处理闰年和闰秒
  4. 性能考虑

    • 避免频繁创建datetime对象
    • 使用timedelta进行计算
    • 缓存常用日期
  5. 国际化

    • 考虑不同地区的日期格式
    • 使用本地化显示
    • 处理不同时区

10. 常见问题

Q1: datetime和time模块有什么区别?

  • datetime模块提供高级日期时间操作
  • time模块提供低级时间操作
  • datetime模块更适合业务逻辑

Q2: 如何处理时区?

  • 使用timezone类创建时区
  • 使用pytz库处理复杂时区
  • 使用UTC作为标准时间

Q3: 如何计算两个日期之间的工作日?

  • 使用weekday()判断工作日
  • 遍历日期范围
  • 排除周末和节假日

Q4: 如何处理闰年?

  • datetime模块自动处理闰年
  • 使用calendar模块判断闰年
  • 注意2月的天数

总结

datetime模块是Python中处理日期和时间的核心模块,提供了丰富的日期时间操作功能。掌握datetime模块可以帮助我们:

  1. 处理日期和时间数据
  2. 进行日期时间计算
  3. 格式化和解析日期时间
  4. 处理时区问题
  5. 实现各种日期时间相关的功能

在实际开发中,datetime模块广泛应用于日志记录、数据分析、任务调度、报表生成等领域。

练习

  1. 编写一个函数,计算两个日期之间的天数
  2. 创建一个日期序列生成器,支持按天、周、月生成
  3. 实现一个年龄计算器,支持精确到天
  4. 编写一个工作日计算器,排除周末和节假日
  5. 创建一个时区转换工具,支持多个时区

下节预告

下一集将学习time模块,了解如何处理时间戳、延迟执行、性能测量等操作。

« 上一篇 sys模块详解 下一篇 » time模块详解