Python 减去时间

0 投票
1 回答
2603 浏览
提问于 2025-04-18 14:53

我从数据库里拿到了一个值,看起来是个字符串格式,比如"03:00:00"。我想在Python里把它当作时间来用,然后设置一个时间范围(比如从02:00:00到04:00:00)。

我已经导入了datetime模块,但每次我想对这个时间值进行操作时,都会出现内部服务器错误。

from datetime import date, time, timedelta

time_limit = "03:00:00" ## this is actually received as a get response from JS

time_upper_limit = time_limit + timedelta(minutes=60)

代码在time_upper_limit那里出错。你知道这是为什么吗?我需要把时间值转换一下吗?

1 个回答

1

你不能把一个字符串和一个 timedelta() 对象相加;你只能把 timedelta() 对象加到其他的 timedeltadatetime 对象和 date 对象上。

你需要先解析这个时间值;你可能应该把它解析成另一个 timedelta() 对象(作为一个持续时间):

hours, minutes, seconds = map(int, time_limit.split(':'))
time_limit = timedelta(hours=hours, minutes=minutes, seconds=seconds)

现在你 可以 把另一个 timedelta() 对象加到它上面:

time_upper_limit = time_limit + timedelta(minutes=60)

示例:

>>> from datetime import timedelta
>>> time_limit = "03:00:00"
>>> hours, minutes, seconds = map(int, time_limit.split(':'))
>>> time_limit = timedelta(hours=hours, minutes=minutes, seconds=seconds)
>>> time_limit
datetime.timedelta(0, 10800)
>>> time_limit + timedelta(minutes=60)
datetime.timedelta(0, 14400)

另一种方法是把它解析成一个 datetime.datetime 对象,比如给时间加上一个日期;datetime.time() 对象不能和 timedelta() 对象一起使用,因为它们的时间不能超过 23:59:59.999999,而 timedelta() 对象可以轻松表示超过一天的时间段:

>>> from datetime import datetime
>>> time_limit = "03:00:00"
>>> dt = datetime.strptime(time_limit, '%H:%M:%S')
>>> dt
datetime.datetime(1900, 1, 1, 3, 0)
>>> dt + timedelta(minutes=60)
datetime.datetime(1900, 1, 1, 4, 0)

由于你的字符串中没有日期部分,最终得到的值会是 1900-01-01。你可以忽略这个问题,只处理时间部分,或者你可以使用 datetime.datetime.combine()datetime.datetime.time() 来提取时间部分,并用一个更合适的日期替换掉(比如 datetime.date.today())。

撰写回答