我有一个来自数据库的值,我相信它是一个字符串格式" 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失败。知道为什么会这样吗?我需要转换时间值吗?
答案 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 }})。