如何睡到特定时间 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时间格式?