Python日期加减案例如何计算时间差

wen python案例 23

本文目录导读:

Python日期加减案例如何计算时间差

  1. 使用 datetime 模块
  2. 使用 timedelta 进行日期加减
  3. 处理日期字符串
  4. 使用 dateutil 模块(第三方库)
  5. 综合实用案例

我来为你详细介绍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
  • 字符串解析:使用strptimedateutil.parser

抱歉,评论功能暂时关闭!