Python减去时间

时间:2014-07-26 16:32:15

标签: python

我有一个来自数据库的值,我相信它是一个字符串格式" 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 个答案:

答案 0 :(得分:1)

您不能对字符串值和timedelta()对象求和;您只能将timedelta()个对象添加到其他timedelta个,datetime个对象和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()提取时间组件,并将日期替换为更符合您需求的日期(例如{{3 }})。