如何睡到特定时间 YYYY-MM-DD HH:MM:SS?

Posted

技术标签:

【中文标题】如何睡到特定时间 YYYY-MM-DD HH:MM:SS?【英文标题】:How to sleep until a specific time YYYY-MM-DD HH:MM:SS? 【发布时间】:2019-06-07 22:43:11 【问题描述】:

我一直在考虑做一个睡眠功能,它会一直睡到某个日期被调用。我的想法基于日期,例如:2019-01-20 12:00:00。

我还没有真正想出如何开始解决这个问题。我的想法是类似的,例如

if there is a date given:
   time.sleep(until the date and time)

所以问题是我怎么可能能够睡到 2019-01-20 12:00:00 的特定时间?

【问题讨论】:

提示: time.sleep() 预计秒数。查看time.strptime() 将字符串转换为自 1970-01-01 00:00 以来的秒数。 如果你想这样做,因为当时应该运行一些代码,看看Python标准库,它带有一个调度程序! docs.python.org/3/library/sched.html 【参考方案1】:

简单,计算多长时间,然后睡觉。

您可以计算达到唤醒时间并在增量时间内休眠所需的时间。

Python 可以计算时间间隔。如果你从另一个中减去一个时间戳,那么你会得到一个datetime.timedelta

import datetime
import time

target = datetime.datetime(2019,1,20,12,0,0)

now = datetime.datetime.now()
delta = target - now
if delta > datetime.timedelta(0):
    print('will sleep: %s' % delta)
    time.sleep(delta.total_seconds())
    print('just woke up')

当然,你可以把它放在一个函数中:

import datetime
import time

target = datetime.datetime(2019,1,20,12,0,0)


def sleep_until(target):
    now = datetime.datetime.now()
    delta = target - now

    if delta > datetime.timedelta(0):
        time.sleep(delta.total_seconds())
        return True


sleep_until(target)

可以查看返回值:只有在休眠时才返回True。

顺便说一句:可以,使用过去的日期作为目标。这将产生一个负数的秒数。休眠一个负值就不会休眠。

如果你的时间是一个字符串,使用这个:

target = datetime.datetime.strptime('20.1.2019 20:00:00', '%d.%m.%Y %H:%M:%s')

target = datetime.datetime.strptime('2019-1-20 20:00:00', '%Y-%m-%d %H:%M:%s')

【讨论】:

你的意思是计算从现在到给定日期有多少秒?我可以这样做,但我想也许有更好的方法,你只需给一个函数一个日期和时间,它会自动休眠到那时:)? 哦,对了!它按我的意愿工作!我唯一确定的一点是我想在datetime.datetime 中输入2019-01-20 12:00:00,我相信它不会工作,因为它是一个字符串而不是一个日期时间对象。您是否认为有一种方法无需像使用2019,1,20,12,0,0 那样手动输入日期,如果您当然没有时间,我会理解的,但无论如何!这是真正有效的答案。如果我可以在日期时间中粘贴2019-01-20 12:00:00,那就太好了 就是这样! target = datetime.datetime.strptime('2019-1-20 20:00:00', '%Y-%m-%d %H:%M:%s') 是我想要的解决方案!我真的很感激,我谢谢你!! :) 我现在已将此列为答案!【参考方案2】:

您可以使用while 循环。

import datetime
_theday="01/01/2019"
while datetime.today() != _theday:
    some stuff

【讨论】:

这是busy waiting 的一种形式,效率极低。我不推荐这种方法。涉及使线程休眠的事情要好得多,尤其是在等待时间很长的情况下。【参考方案3】:

你的意思是这样的:

from time import sleep
from datetime import datetime

x = datetime.datetime.strptime('2019-01-20 12:00:00', '%Y-%m-%d %H:%M:%S')
y = datetime.now()

sleep((max(x,y) - min(x,y)).seconds)

【讨论】:

我猜是这样的。我认为它应该是 x-y 因为如果你现在做时间你会得到否定 - 某个日期?但是,是的。其中 x = 2019-01-20 12:00:00 哦,真奇怪。我使用x = 2019-01-20 12:00:00 尝试了这个,我得到了 ` print(((max(x,y) - min(x,y)).seconds)) ----- TypeError: '>' not supported between ' datetime.datetime' 和 'str'` x 必须是日期时间对象而不是字符串【参考方案4】:

我以有效的方式解决了你的问题:

import time, datetime
# given_date --> Your target time and date
dur = time.mktime(datetime.datetime.strptime(given_date, "%d-%b-%y %H:%M:%S").timetuple()) - time.time()
time.sleep(dur)

【讨论】:

以上是关于如何睡到特定时间 YYYY-MM-DD HH:MM:SS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在进行选择查询时将 YYYY-MM-DD HH:mm:ss 中的时间戳转换为 Hive 中的 YYYY-MM-DD HH:mm:ss.SSS?

如何快速转换日期 yyyy-mm-dd'T'HH:mm:ss.SSSZ [重复]

如何从日期格式“yyyy-MM-dd'T'HH:mm:ss.SSSZ”中分别获取日期、年份、小时、分钟?

java如何实现各国时间格式转换成yyyy-MM-dd HH:mm:ss时间格式?

如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy

JS 如何将 yyyy-MM-dd HH:mm:ss字符串 转换成yyyy-MM-dd字符串