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 插槽的正确时间。
我有一个六小时时段列表 ['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 插槽的正确时间。