【问题标题】:How to set python to sleep till a particular time? [duplicate]如何将python设置为睡眠到特定时间? [复制]
【发布时间】:2020-08-29 06:02:34
【问题描述】:

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

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

【问题讨论】:

    标签: python date datetime


    【解决方案1】:

    这个问题有一个细微差别:当列表中的最短时间小于当前时间。在这种情况下,最合理的方法是睡到列表中最小的时间明天。例如,让我们考虑当前时间 23:59 和 tl = [00:10, 01:30],那么脚本应该休眠到 00: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())
    

    【讨论】:

    • sleep((min(times) - dt.datetime.now()).total_seconds()) 给出负值。ValueError: sleep length must be non-negative
    • 您是否使用与答案中相同的tl
    【解决方案2】:

    类似的东西呢:

    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)
    
    

    【讨论】:

    • 为什么不使用t=min(el for el in l if el > datetime.now().strftime('%H:%M')),计算秒数差异并等待该秒数
    • @rioV8 哦,是的,你是对的。我后来读到了过去的部分,所以我只是添加了这一行。我更新了我的答案。
    • 去掉[]你添加了一个生成器而不是一个列表
    • @rioV8 为什么? [] 有什么问题?两者都返回正确的最小值。
    • 不需要列表就不用先转成列表,列表可能很大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多