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())。
本文涉及AI创作
内容由AI创作,请仔细甄别