我获得了班次开始时间列表:[1,4,9,13,17,21]
这意味着:
示例:
答案 0 :(得分:0)
这应该这样做 -
from datetime import timedelta, datetime as dt
dt_str = 'March 15th 00:30'
dt_given = dt.strptime(dt_str, '%B %dth %H:%M')
L = [1, 4, 9, 13, 17, 21]
round_hr = dt_given.replace(hour=0, minute=0)
def get_shift(L, dt_given):
try:
return dt_given.replace(hour=max( [ i for i in L if dt_given > dt_given.replace(hour=i, minute=0) ] ), minute=0)
except ValueError:
return (dt_given - timedelta(days=1)).replace(hour=max(L), minute=0)
shift = get_shift(L, dt_given)
print(dt.strftime(shift, '%B %dth %H:%M'))
<强>输出强>
March 14th 21:00
<强>击穿强>
[ i for i in L if dt_given > dt_given.replace(hour=i, minute=0) ]
此作品将hours
中的所有L
转换为同一天的相应日期,然后比较并检索小于目标日期的所有日期。最重要的max()
可以立即转变。
问题从前一天/第二天开始。在您的or March 15th 00:30
示例中,它失败了,因为同一天没有转换日期。在这种情况下,有catch
只是减去一天并从那里获得最新的转变。
except ValueError:
return (dt_given - timedelta(days=1)).replace(hour=max(L), minute=0)
我不确定我可能会遗漏哪些边界/边缘情况,但我都是耳朵。