给定班次开始时间列表,您如何确定特定小时属于哪个范围?

时间:2018-03-14 04:53:03

标签: python algorithm date datetime time

我获得了班次开始时间列表:[1,4,9,13,17,21]

这意味着:

  1. 第一个人负责从1:00到3:59
  2. 第二个人负责从4:00到8:59
  3. ...
  4. 最后一个人负责从21:00到01:00
  5. 给定日期时间,我如何获得最后一班的起始日期时间?

    示例:

    • 3月14日12:49,它应该在3月14日9:00返回
    • 3月14日23:59,它应该在3月14日21:00返回
    • 3月15日00:30,应该在3月14日21:00返回。

1 个答案:

答案 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)

我不确定我可能会遗漏哪些边界/边缘情况,但我都是耳朵。