杰瑞科技汇

Python datetime 如何计算时间差?

datetime 模块主要包含以下几个核心类:

Python datetime 如何计算时间差?-图1
(图片来源网络,侵删)
  1. datetime: 同时包含日期和时间信息。
  2. date: 仅包含日期信息(年、月、日)。
  3. time: 仅包含时间信息(时、分、秒、微秒)。
  4. timedelta: 表示时间间隔或持续时间,用于日期/时间的计算。
  5. tzinfo: 时区信息的抽象基类,用于处理不同时区的时间。

基本概念:获取当前时间

你需要导入 datetime 模块,最常用的操作是获取当前的日期和时间。

from datetime import datetime
# 获取当前的日期和时间
now = datetime.now()
print(f"当前完整日期和时间: {now}")
print(f"当前日期: {now.date()}")
print(f"当前时间: {now.time()}")
# 获取当前的日期(使用 date 类)
today = datetime.now().date()
print(f"当前日期 (date 对象): {today}")

输出示例:

当前完整日期和时间: 2025-10-27 15:30:55.123456
当前日期: 2025-10-27
当前时间: 15:30:55.123456
当前日期 (date 对象): 2025-10-27

创建特定的时间点

你可以使用 datetime() 构造函数来创建一个特定的 datetime 对象。

语法: datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)

Python datetime 如何计算时间差?-图2
(图片来源网络,侵删)
from datetime import datetime
# 创建一个特定的日期和时间
dt1 = datetime(2025, 10, 27, 10, 30, 0)
print(f"创建的特定时间: {dt1}")
# 创建一个特定的日期(时间部分默认为 00:00:00)
dt2 = datetime(2025, 1, 1)
print(f"创建的特定日期: {dt2}")

输出示例:

创建的特定时间: 2025-10-27 10:30:00
创建的特定日期: 2025-01-01 00:00:00

字符串与 datetime 对象的相互转换

这是最常见的操作之一,比如从文件或数据库中读取时间字符串,或者将时间对象格式化后显示给用户。

1 字符串转 datetime (使用 strptime)

strptime (string parse time) 可以根据指定的格式将字符串解析为 datetime 对象。

from datetime import datetime
date_string = "2025-10-27 15:45:30"
# %Y: 四位年份, %m: 两位月份, %d: 两位日
# %H: 24小时制小时, %M: 分钟, %S: 秒
format_string = "%Y-%m-%d %H:%M:%S"
dt_object = datetime.strptime(date_string, format_string)
print(f"字符串: {date_string}")
print(f"转换后的 datetime 对象: {dt_object}")
print(f"转换后的 datetime 对象类型: {type(dt_object)}")

输出示例:

Python datetime 如何计算时间差?-图3
(图片来源网络,侵删)
字符串: 2025-10-27 15:45:30
转换后的 datetime 对象: 2025-10-27 15:45:30
转换后的 datetime 对象类型: <class 'datetime.datetime'>

常用格式化代码: | 代码 | 含义 | 示例 | | :--- | :------------------- | :-------------- | | %Y | 四位年份 | 2025 | | %y | 两位年份 | 23 | | %m | 两位月份 (01-12) | 10 | | %B | 月份全名 | October | | %b | 月份缩写 | Oct | | %d | 两位日 (01-31) | 27 | | %H | 24小时制小时 (00-23) | 15 | | %I | 12小时制小时 (01-12) | 03 | | %M | 分钟 (00-59) | 45 | | %S | 秒 (00-59) | 30 | | %p | AM/PM 标记 | PM |

2 datetime 转字符串 (使用 strftime)

strftime (string format time) 可以将 datetime 对象格式化为指定的字符串。

from datetime import datetime
dt_object = datetime.now()
# 格式化为 "YYYY-MM-DD HH:MM:SS" 格式
formatted_string1 = dt_object.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化后的字符串1: {formatted_string1}")
# 格式化为 "DD/MM/YYYY" 格式
formatted_string2 = dt_object.strftime("%d/%m/%Y")
print(f"格式化后的字符串2: {formatted_string2}")
# 格式化为 "Month Day, Year" 格式
formatted_string3 = dt_object.strftime("%B %d, %Y")
print(f"格式化后的字符串3: {formatted_string3}")

输出示例:

格式化后的字符串1: 2025-10-27 15:50:12
格式化后的字符串2: 27/10/2025
格式化后的字符串3: October 27, 2025

时间计算

时间计算的核心是 timedelta 对象。

1 使用 timedelta 进行加减

from datetime import datetime, timedelta
now = datetime.now()
# 计算 3 天后的时间
future_time = now + timedelta(days=3)
print(f"3 天后是: {future_time}")
# 计算 2 小时 30 分钟前的时间
past_time = now - timedelta(hours=2, minutes=30)
print(f"2小时30分钟前是: {past_time}")
# 计算 10 秒后的时间
future_time_seconds = now + timedelta(seconds=10)
print(f"10秒后是: {future_time_seconds}")

2 两个 datetime 对象相减

两个 datetime 对象相减会得到一个 timedelta 对象,表示它们之间的时间差。

from datetime import datetime
start_time = datetime(2025, 1, 1)
end_time = datetime(2025, 10, 27)
time_difference = end_time - start_time
print(f"时间差: {time_difference}")
print(f"时间差的类型: {type(time_difference)}")
# 可以从 timedelta 对象中提取具体的天数、秒数等
print(f"相差的天数: {time_difference.days}")
print(f"相差的秒数: {time_difference.seconds}") # 注意:seconds 不包含天数部分的秒数
print(f"相差的总秒数: {time_difference.total_seconds()}")

输出示例:

时间差: 301 days, 0:00:00
时间差的类型: <class 'datetime.timedelta'>
相差的天数: 301
相差的秒数: 0
相差的总秒数: 26006400.0

访问和修改时间组件

你可以像访问对象的属性一样访问 datetime 对象的各个部分。

from datetime import datetime
dt = datetime(2025, 10, 27, 15, 45, 30, 500000)
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}")
print(f"星期几 (0是周一, 6是周日): {dt.weekday()}")
print(f"星期几 (1是周一, 7是周日): {dt.isoweekday()}")

修改时间组件: 注意:datetime 对象是不可变的,所以修改操作会返回一个新的 datetime 对象。

from datetime import datetime
dt = datetime(2025, 10, 27, 15, 45, 30)
# 将年份改为 2025
new_dt = dt.replace(year=2025)
print(f"修改年份后: {new_dt}")
# 将小时改为 9
new_dt_hour = dt.replace(hour=9)
print(f"修改小时后: {new_dt_hour}")

比较时间

datetime 对象支持标准的比较运算符(<, >, , , <=, >=)。

from datetime import datetime
date1 = datetime(2025, 1, 1)
date2 = datetime(2025, 12, 31)
date3 = datetime(2025, 1, 1)
print(f"date1 < date2: {date1 < date2}")  # True
print(f"date1 > date2: {date1 > date2}")  # False
print(f"date1 == date3: {date1 == date3}") # True

实用示例:计算年龄

这是一个非常实用的例子,展示了如何组合使用以上技巧。

from datetime import datetime
def calculate_age(birth_date_str):
    """
    根据出生日期字符串计算年龄。
    :param birth_date_str: 出生日期,格式 'YYYY-MM-DD'
    :return: 年龄(整数)
    """
    # 1. 将字符串转换为 datetime 对象
    birth_date = datetime.strptime(birth_date_str, "%Y-%m-%d").date()
    # 2. 获取今天的日期
    today = datetime.now().date()
    # 3. 计算年份差
    age = today.year - birth_date.year
    # 4. 检查生日是否已过,如果未过,年龄减1
    # (today.month, today.day) < (birth_date.month, birth_date.day) 会比较元组
    if (today.month, today.day) < (birth_date.month, birth_date.day):
        age -= 1
    return age
# 示例
birth_date_str = "1990-05-15"
age = calculate_age(birth_date_str)
print(f"如果出生日期是 {birth_date_str},那么当前年龄是: {age} 岁")

功能 关键方法/函数 示例
获取当前时间 datetime.now() now = datetime.now()
创建特定时间 datetime() dt = datetime(2025, 10, 27)
字符串 -> datetime datetime.strptime() dt = datetime.strptime("2025-10-27", "%Y-%m-%d")
datetime -> 字符串 datetime.strftime() s = dt.strftime("%Y/%m/%d")
时间间隔 timedelta() delta = timedelta(days=7)
时间加减 , future_time = now + delta
时间差 (两个datetime相减) diff = end_time - start_time
访问组件 .year, .month, .day year = dt.year
修改组件 .replace() new_dt = dt.replace(year=2025)
比较时间 <, >, if date1 < date2:

掌握了这些基本操作,你就可以应对绝大多数与日期和时间相关的编程任务了。

分享:
扫描分享到社交APP
上一篇
下一篇