Return包含给定时间(当前时间)的时间段

Return the timeslot that includes a given time (current time)

我有一个六小时时段列表 ['00:00','06:00','12:00','18:00']。我需要构建一个函数,如果当前时间低于:returns 其中一个时隙:

From 00:00 - to 05:59 -> # should return -> 00:00
From 06:00 - to 11:59 -> # should return -> 06:00
From 12:00 - to 17:59 -> # should return -> 12:00
From 18:00 - to 23:59 -> # should return -> 18:00

I asked for a similar function that returns the closest and furthest time to the current time at: . I used the same code from @RJ Adriaansen for my current question but it didn't work as expected.

代码如下:

current_time = '10:00'
time = ['00:00','06:00','12:00','18:00']

def get_time(time):
  return datetime.strptime(time, '%H:%M')


current_time = get_time(current_time)
time = [get_time(i) for i in time]

print(min(time,key=lambda x : abs(current_time-x)).strftime('%H:%M'))

# It returns 12:00, while it should return 06:00 in my case.

谁能告诉我我需要做什么才能解决这个问题?

abs(current_time) 忽略 x 是在 current_time 之前还是之后,所以它 returns 最近的时间段,而不是从 [=13= 之前开始的最近时间段].

如果时隙已排序,则循环直到找到小于或等于当前时间的时隙。

for slot in time:
    if slot <= current_time:
        print(slot.strftime('%H:%M'))
        break

如果它们尚未排序,请使用 for slot in sorted(time):

这实际上是一个字符串操作问题,而不是 date/time 问题(因为 不需要 datetime 参与)。

这是一个函数(包括测试工具),可以满足您的需求(请注意,我已将您的 6:00 更改为 06:00,因此它与问题的其余部分匹配并且相同格式与其他时间一样,特别是 00:00 表示前导零):

def which_slot(slots, value):
    if slots[0] != "00:00":
        raise Exception("first slot must be 00:00")
    return slots[len(slots) - sum([1 for item in slots[1:] if value < item]) - 1]

slots = ["00:00", "06:00", "12:00", "18:00"]

for test in ["00:00", "00:01"]:
    print(f"{test} : {which_slot(slots, test)}")

for hour in [3, 6, 12, 18, 21]:
    for test in [f"{hour-1:02}:59", f"{hour:02}:00", f"{hour:02}:01"]:
        print(f"{test} : {which_slot(slots, test)}")

for test in ["23:59"]:
    print(f"{test} : {which_slot(slots, test)}")

输出显示您为各种输入获得的值:

00:00 : 00:00
00:01 : 00:00
02:59 : 00:00
03:00 : 00:00
03:01 : 00:00
05:59 : 00:00
06:00 : 06:00
06:01 : 06:00
11:59 : 06:00
12:00 : 12:00
12:01 : 12:00
17:59 : 12:00
18:00 : 18:00
18:01 : 18:00
20:59 : 18:00
21:00 : 18:00
21:01 : 18:00
23:59 : 18:00

它的工作方式是为每个小于您想要的项目的插槽构建一个 1 值列表,然后对该列表求和。

这为您提供了一个 反向 位置(早期总和更高),您可以将其操纵到索引中。然后该索引用于 return 插槽的正确时间。