Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将python设置为睡眠到特定时间?_Python_Date_Datetime - Fatal编程技术网

如何将python设置为睡眠到特定时间?

如何将python设置为睡眠到特定时间?,python,date,datetime,Python,Date,Datetime,我有一个列表,其中包含以下字符串格式的时间['13:45','12:30','11:40']。因此,脚本应该在字符串格式列表中选择最早的时间,并等待该时间出现。代码的第一部分,可以用min函数完成最小值的选取。怎样才能等到那个时候呢 而且,如果时间提到了至少一个已经完成的时间(过去),那么它应该选择下一个最低的时间。类似于: from time import sleep from datetime import datetime tl = ['13:45','12:30','11:40']

我有一个列表,其中包含以下字符串格式的时间
['13:45','12:30','11:40']
。因此,脚本应该在字符串格式列表中选择最早的时间,并等待该时间出现。代码的第一部分,可以用min函数完成最小值的选取。怎样才能等到那个时候呢


而且,如果时间提到了至少一个已经完成的时间(过去),那么它应该选择下一个最低的时间。

类似于:

from time import sleep
from datetime import datetime

tl = ['13:45','12:30','11:40']

## remove times less or equal current time, then get minimum
t = min(el for el in tl if el > datetime.now().strftime('%H:%M'))

## sleep until we pass the minimum time
## we check this every second
while t > datetime.now().strftime('%H:%M'):
    sleep(1)


这个问题有一个细微差别:当列表中的最短时间小于当前时间时。在这种情况下,最合理的方法是睡到明天列表中最短的时间。例如,让我们考虑当前时间23∶59和<代码> TL= [00∶10,01:30] < /代码>,然后脚本应该睡到0点10分(明天)。 以下是解决方案:

import time
from datetime import datetime
from datetime import timedelta
from dateutil import parser

now = datetime.now()


def parse_times(tl):
    for t in tl:
        parsed_time = parser.parse(t)
        if parsed_time > now:
            yield parsed_time
        else:
            yield parsed_time + timedelta(days=1)


tl = ['13:45', '12:30', '11:40']

parsed_times = parse_times(tl)
next_time = min(parsed_times)
time.sleep((next_time - now).total_seconds())

为什么不使用
t=min(如果el>datetime.now().strftime(“%H:%M”)
,计算秒差并等待该秒数seconds@rioV8哦,是的,你是对的。后来我读了这篇文章,删除了过去的几次,所以我只添加了这一行。我更新了我的答案。删除
[]
您添加的是生成器,而不是list@rioV8为什么?
[]
有什么问题?两者都返回正确的最小值。无需首先将其转换为列表。如果您不需要列表,则列表可能非常大。(min(times)-dt.datetime.now())。total_seconds()给出的值为负值。value错误:睡眠长度必须为非负值是否使用与答案中相同的
tl