本文目录导读:

我来为你详细介绍Python中计算日期时间差的几种常用方法。
使用 datetime 模块
基本时间差计算
from datetime import datetime, date, timedelta
# 创建两个日期时间对象
start_time = datetime(2024, 1, 1, 10, 30, 0)
end_time = datetime(2024, 1, 5, 14, 45, 30)
# 计算时间差
time_diff = end_time - start_time
print(f"时间差: {time_diff}")
print(f"天数: {time_diff.days}")
print(f"秒数: {time_diff.seconds}")
print(f"总秒数: {time_diff.total_seconds()}")
计算不同单位的时间差
from datetime import datetime
def calculate_time_diff(start, end):
"""计算两个时间之间的详细差值"""
diff = end - start
# 提取天数和剩余秒数
days = diff.days
seconds = diff.seconds
# 计算小时、分钟、秒
hours = seconds // 3600
minutes = (seconds % 3600) // 60
secs = seconds % 60
return {
'days': days,
'hours': hours,
'minutes': minutes,
'seconds': secs,
'total_seconds': diff.total_seconds()
}
# 示例
start = datetime(2024, 1, 1, 8, 0, 0)
end = datetime(2024, 1, 5, 15, 30, 45)
result = calculate_time_diff(start, end)
print(f"相差 {result['days']} 天 {result['hours']} 小时 {result['minutes']} 分钟 {result['seconds']} 秒")
print(f"总秒数: {result['total_seconds']}")
使用 timedelta 进行日期加减
日期加减操作
from datetime import datetime, timedelta
now = datetime.now()
print(f"当前时间: {now}")
# 加几天
future_date = now + timedelta(days=10)
print(f"10天后: {future_date}")
# 减几天
past_date = now - timedelta(days=5)
print(f"5天前: {past_date}")
# 加减小时
future_hour = now + timedelta(hours=3)
print(f"3小时后: {future_hour}")
# 组合加减
complex_date = now + timedelta(days=7, hours=5, minutes=30)
print(f"7天5小时30分钟后: {complex_date}")
实用案例:计算年龄
from datetime import datetime
def calculate_age(birth_date, current_date=None):
"""计算精确年龄"""
if current_date is None:
current_date = datetime.now()
# 计算粗略年龄
age = current_date.year - birth_date.year
# 检查是否已经过了生日
if (current_date.month, current_date.day) < (birth_date.month, birth_date.day):
age -= 1
return age
# 示例
birthday = datetime(1990, 5, 15)
today = datetime(2024, 3, 20)
age = calculate_age(birthday, today)
print(f{年龄: {age}岁})
处理日期字符串
字符串转日期并计算差值
from datetime import datetime
# 日期字符串格式
date_str1 = "2024-01-01 10:30:00"
date_str2 = "2024-01-05 14:45:30"
# 解析字符串
date1 = datetime.strptime(date_str1, "%Y-%m-%d %H:%M:%S")
date2 = datetime.strptime(date_str2, "%Y-%m-%d %H:%M:%S")
# 计算差值
diff = date2 - date1
print(f"字符串日期差: {diff}")
# 另一种常见格式
date_str3 = "01/15/2024"
date3 = datetime.strptime(date_str3, "%m/%d/%Y")
print(f"解析后的日期: {date3}")
使用 dateutil 模块(第三方库)
# 需要先安装: pip install python-dateutil
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta
from datetime import datetime
# 自动解析各种日期格式
date1 = parse("2024-01-01")
date2 = parse("Jan 15, 2024")
date3 = parse("01/20/2024 15:30")
print(f"解析的日期1: {date1}")
print(f"解析的日期2: {date2}")
print(f"解析的日期3: {date3}")
# 更精确的日期差计算
start = datetime(2024, 1, 1)
end = datetime(2024, 3, 15)
diff = relativedelta(end, start)
print(f"相差 {diff.years} 年 {diff.months} 月 {diff.days} 天")
综合实用案例
计算项目工期
from datetime import datetime, timedelta
def calculate_project_duration(tasks):
"""计算项目总工期和各个阶段时间"""
total_time = timedelta()
phase_times = []
for task_name, start_str, end_str in tasks:
start = datetime.strptime(start_str, "%Y-%m-%d")
end = datetime.strptime(end_str, "%Y-%m-%d")
duration = end - start
total_time += duration
phase_times.append({
'task': task_name,
'start': start,
'end': end,
'duration': duration,
'days': duration.days
})
return total_time, phase_times
# 示例任务
tasks = [
("需求分析", "2024-01-01", "2024-01-15"),
("设计阶段", "2024-01-16", "2024-02-05"),
("开发阶段", "2024-02-06", "2024-03-20"),
("测试阶段", "2024-03-21", "2024-04-10")
]
total_duration, phases = calculate_project_duration(tasks)
print("项目工期详情:")
for phase in phases:
print(f"{phase['task']}: {phase['days']} 天")
print(f"\n总工期: {total_duration.days} 天")
时间差格式化输出
from datetime import datetime
def format_time_difference(start, end):
"""格式化输出时间差"""
diff = end - start
total_seconds = int(diff.total_seconds())
# 转换为友好的格式
days = total_seconds // 86400
hours = (total_seconds % 86400) // 3600
minutes = (total_seconds % 3600) // 60
seconds = total_seconds % 60
parts = []
if days > 0:
parts.append(f"{days}天")
if hours > 0:
parts.append(f"{hours}小时")
if minutes > 0:
parts.append(f"{minutes}分钟")
if seconds > 0 or not parts:
parts.append(f"{seconds}秒")
return "".join(parts)
# 示例
start = datetime(2024, 1, 1, 8, 30, 0)
end = datetime(2024, 1, 5, 15, 45, 30)
print(format_time_difference(start, end)) # 输出: 4天7小时15分钟30秒
datetime模块: 基础日期时间处理timedelta: 日期加减运算strptime/strftime: 字符串与日期互转dateutil: 更强大的日期解析和计算- 时间差: 使用减法运算获取,可使用
total_seconds()转秒
选择哪种方法取决于你的具体需求:
- 简单日期加减:使用
timedelta - 复杂日期计算:使用
dateutil.relativedelta - 字符串解析:使用
strptime或dateutil.parser