pin_drop当前位置:知识文库 ❯ 图文

Python标准库datetime使用

一、datetime模块概述

datetime 是Python标准库中用于处理日期和时间的核心模块。它提供了多个类来操作日期、时间、时间差和时区信息。无论是日志记录、数据分析、定时任务还是国际化应用,datetime模块都是不可或缺的工具。

datetime模块包含四个主要类:date(日期)、time(时间)、datetime(日期时间组合)和 timedelta(时间差)。


二、核心类与语法

1. date类 - 日期操作

代码示例

from datetime import date

# 创建日期对象
today = date.today()           # 今天的日期
specific = date(2026, 7, 1)    # 指定日期

# 获取日期属性
print(f"年: {today.year}")
print(f"月: {today.month}")
print(f"日: {today.day}")
print(f"星期: {today.weekday()}")  # 0=周一, 6=周日

2. time类 - 时间操作

代码示例

from datetime import time

# 创建时间对象
now_time = time(14, 30, 45)        # 14:30:45
with_micro = time(14, 30, 45, 123456)  # 包含微秒

# 获取时间属性
print(f"时: {now_time.hour}")
print(f"分: {now_time.minute}")
print(f"秒: {now_time.second}")
print(f"微秒: {with_micro.microsecond}")

3. datetime类 - 日期时间组合

代码示例

from datetime import datetime

# 创建datetime对象
now = datetime.now()              # 当前日期时间
specific_dt = datetime(2026, 7, 1, 14, 30, 45)

# 常用方法
print(f"当前时间戳: {now.timestamp()}")
print(f"ISO格式: {now.isoformat()}")
print(f"自定义格式: {now.strftime('%Y-%m-%d %H:%M:%S')}")

4. timedelta类 - 时间差计算

代码示例

from datetime import datetime, timedelta

# 创建时间差
one_day = timedelta(days=1)
one_week = timedelta(weeks=1)
two_hours = timedelta(hours=2)

# 时间加减运算
now = datetime.now()
tomorrow = now + one_day
next_week = now + one_week
two_hours_later = now + two_hours

# 计算两个日期的差
date1 = datetime(2026, 7, 1)
date2 = datetime(2026, 12, 31)
diff = date2 - date1
print(f"相差 {diff.days} 天")

三、基本用法详解

日期时间格式化

代码示例

from datetime import datetime

now = datetime.now()

# strftime(): datetime -> 字符串
formatted1 = now.strftime('%Y-%m-%d')           # 2026-07-01
formatted2 = now.strftime('%Y年%m月%d日')        # 2026年07月01日
formatted3 = now.strftime('%H:%M:%S')           # 14:30:45
formatted4 = now.strftime('%Y-%m-%d %H:%M:%S')  # 2026-07-01 14:30:45

print(formatted1)
print(formatted2)
print(formatted3)
print(formatted4)

字符串解析为日期时间

代码示例

from datetime import datetime

# strptime(): 字符串 -> datetime
date_str1 = '2026-07-01'
date_str2 = '2026年7月1日 14:30'
date_str3 = '01/07/2026 14:30:45'

dt1 = datetime.strptime(date_str1, '%Y-%m-%d')
dt2 = datetime.strptime(date_str2, '%Y年%m月%d日 %H:%M')
dt3 = datetime.strptime(date_str3, '%d/%m/%Y %H:%M:%S')

print(dt1)
print(dt2)
print(dt3)

时间差计算应用

代码示例

from datetime import datetime

# 计算年龄
birthday = datetime(1990, 5, 15)
today = datetime.now()
age_delta = today - birthday
age_years = age_delta.days // 365
print(f"年龄约为 {age_years} 岁")

# 计算项目剩余时间
deadline = datetime(2026, 12, 31, 23, 59, 59)
remaining = deadline - today
print(f"距离截止日期还有 {remaining.days} 天")

四、完整代码示例

示例1:日志时间戳生成器

代码示例

from datetime import datetime

def generate_log_timestamp():
    """生成标准日志时间戳"""
    now = datetime.now()
    timestamp = now.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]  # 精确到毫秒
    return f"[{timestamp}]"

def log_message(level, message):
    """记录日志消息"""
    timestamp = generate_log_timestamp()
    print(f"{timestamp} [{level.upper()}] {message}")

# 使用示例
log_message('info', '程序启动')
log_message('warning', '内存使用率超过80%')
log_message('error', '数据库连接失败')

示例2:倒计时计算器

代码示例

from datetime import datetime

def countdown_calculator(target_date_str):
    """计算距离目标日期的倒计时"""
    target = datetime.strptime(target_date_str, '%Y-%m-%d')
    today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
    
    delta = target - today
    
    if delta.days < 0:
        print(f"目标日期已过去 {-delta.days} 天")
    elif delta.days == 0:
        print("今天是目标日期!")
    else:
        print(f"距离目标日期还有 {delta.days} 天")
        
        # 更详细的分解
        weeks = delta.days // 7
        remaining_days = delta.days % 7
        print(f"即 {weeks} 周 {remaining_days} 天")

# 使用示例
countdown_calculator('2026-12-31')
countdown_calculator('2027-01-01')

示例3:工作日判断器

代码示例

from datetime import datetime, timedelta

def is_workday(date_obj):
    """判断是否为工作日(周一到周五)"""
    return date_obj.weekday() < 5  # 0-4是周一到周五

def get_next_workday(from_date=None):
    """获取下一个工作日"""
    if from_date is None:
        from_date = datetime.now()
    
    next_day = from_date + timedelta(days=1)
    while not is_workday(next_day):
        next_day += timedelta(days=1)
    
    return next_day

def count_workdays(start_date, end_date):
    """计算两个日期之间的工作日数量"""
    if isinstance(start_date, str):
        start_date = datetime.strptime(start_date, '%Y-%m-%d')
    if isinstance(end_date, str):
        end_date = datetime.strptime(end_date, '%Y-%m-%d')
    
    workdays = 0
    current = start_date
    while current <= end_date:
        if is_workday(current):
            workdays += 1
        current += timedelta(days=1)
    
    return workdays

# 使用示例
today = datetime.now()
print(f"今天是工作日吗?{is_workday(today)}")
print(f"下一个工作日:{get_next_workday().strftime('%Y-%m-%d')}")
print(f"本月工作日数量:{count_workdays('2026-07-01', '2026-07-31')}")

示例4:日期范围生成器

代码示例

from datetime import datetime, timedelta

def date_range(start_date, end_date, step_days=1):
    """生成日期范围内的所有日期"""
    if isinstance(start_date, str):
        start_date = datetime.strptime(start_date, '%Y-%m-%d')
    if isinstance(end_date, str):
        end_date = datetime.strptime(end_date, '%Y-%m-%d')
    
    dates = []
    current = start_date
    while current <= end_date:
        dates.append(current.strftime('%Y-%m-%d'))
        current += timedelta(days=step_days)
    
    return dates

# 使用示例
week_dates = date_range('2026-07-01', '2026-07-07')
print(f"本周日期:{week_dates}")

month_dates = date_range('2026-07-01', '2026-07-31', step_days=7)
print(f"每周日期:{month_dates}")

五、注意事项与最佳实践

注意1:datetime对象是不可变的(immutable)。所有修改操作都会返回新的对象,而不是修改原对象。这意味着你可以安全地在多个地方使用同一个datetime对象,不用担心被意外修改。

注意2:处理时区时,建议使用 pytz 或 Python 3.9+ 的 zoneinfo 模块,而不是手动计算时区偏移。这可以避免夏令时等复杂问题。

注意3:在比较或计算时间差时,确保所有datetime对象的时区信息一致。要么都是naive(无时区信息),要么都是aware(有时区信息)。混合比较会抛出TypeError。

注意4:使用 strptime() 解析字符串时,格式字符串必须与实际字符串完全匹配,否则会抛出ValueError。建议添加异常处理来捕获格式错误。

小贴士

Python 3.9+ 引入了 zoneinfo 模块,提供了IANA时区数据库的原生支持。对于新项目,推荐使用 zoneinfo 而不是第三方库 pytz。例如:from zoneinfo import ZoneInfo; dt = datetime.now(ZoneInfo("Asia/Shanghai"))


六、课程小结

  • 核心类date(日期)、time(时间)、datetime(日期时间)、timedelta(时间差)

  • 格式化strftime() 将datetime转为字符串,strptime() 将字符串转为datetime

  • 时间运算:使用 timedelta 进行日期加减运算,支持天、周、小时等单位

  • 时区处理:使用 zoneinfo(Python 3.9+)或 pytz 处理时区

  • 不可变性:datetime对象是不可变的,所有操作返回新对象


七、练习题

练习1

编写一个程序,获取当前日期时间,并分别输出:① 格式为"YYYY年MM月DD日 HH时MM分SS秒"的字符串;② 今天是星期几(中文);③ 今天是今年的第几天。

练习2

编写一个函数 calculate_age(birthday_str),接收生日字符串(格式:YYYY-MM-DD),计算并返回精确年龄(包括年、月、日)。

常见问题

datetime和date有什么区别?

date 只包含日期信息(年月日),datetime 包含日期和时间信息(年月日时分秒微秒)。可以通过 datetime.date() 方法从datetime提取date部分。

如何处理时区转换?

使用 astimezone() 方法进行时区转换。首先需要创建带时区信息的datetime对象,例如 datetime.now(ZoneInfo("Asia/Shanghai")),然后调用 dt.astimezone(ZoneInfo("UTC")) 转换到UTC时区。

为什么不能直接比较带时区和不带时区的datetime?

因为带时区的datetime(aware)表示的是绝对时间点,而不带时区的datetime(naive)只是本地时间表示。两者比较会产生歧义,Python会抛出TypeError。解决方法是统一转换为aware或naive,通常建议全部使用aware对象。

timedelta支持哪些时间单位?

timedelta 支持的参数包括:weeks、days、hours、minutes、seconds、milliseconds、microseconds。内部会统一转换为days、seconds和microseconds三个属性存储。

如何获取当前时间戳?

使用 datetime.now().timestamp() 获取当前时间戳(浮点数,包含小数部分表示微秒)。如果需要整数时间戳,可以使用 int(datetime.now().timestamp())

标签: Python datetime 日期时间 标准库 timedelta strftime 时区处理

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python标准库random 下一篇: Python标准库json使用

poll相关推荐