HOWTO · Python
如何在 Python 中计算日期时间之差
介绍如何在 Python 中计算两个日期时间之间的时长。
本页内容
使用 later - earlier 可以用一个 datetime 对象减去另一个。Python 会返回一个 timedelta,表示两个值之间经过的时长。你可以读取它的天数和秒数,也可以将其换算为总秒数、分钟数或小时数。
在 Python 中使用 datetime 模块计算日期时间之差
datetime 模块提供日期和时间对象。创建对象时必须指定年、月和日;小时、分钟、秒和微秒是可选项。下面的示例使用固定值,因此运行结果不会随执行时间而改变。
from datetime import datetime
earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier
print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5
结果是一个表示两小时三十分钟的 timedelta。它的 days、seconds 和 microseconds 属性分别表示经过时长按规范化方式拆分后的部分。若要取得整个时长的秒数,应对 timedelta(而不是 datetime)调用 total_seconds()。将这个值除以 60 可得分钟数,除以 3,600 可得小时数。如果时长不是整分钟或整小时,计算结果会保留小数部分。
days 属性表示完整天数,seconds 表示规范化后不足一天的剩余秒数;两者都不能单独代表总秒数。例如,时长超过一天时,seconds 仍可能小于 86,400。需要计算整个时间跨度的秒数时,应使用 total_seconds()。如果时长包含微秒,返回值可能是浮点数。
如果只需要整数单位,请明确选择舍入规则。转换为 int() 会向零截断,并不会四舍五入到最近的单位。此外,一年并不是固定时长:把 365 天当作一年只是近似值,因为闰年和日历月份边界都会影响日历计算。如果问题涉及“某日期的一年后”这类日历含义,应采用明确的日历计算方式,而不是按经过的秒数换算。
只有在两个值能够以一致方式进行比较时,才能直接相减。没有时区信息的 naive 值可以彼此相减。对于 aware 值,如果要计算跨越时区转换的实际经过时长,应使用 astimezone(timezone.utc) 将两者都标准化为 UTC。naive 值与 aware 值混合相减会引发 TypeError;相减前应有意识地设置或转换时区信息。