检查当前时间和下一个第 5 分钟之间的时差



已编辑(以澄清我的目的(

我需要编写一个函数,将一个小时划分为 12 个区间,找到当前时间所在的区间,然后计算当前时间和较大区间边界之间的时差,例如第 0 分钟、第 5 分钟、第 10 分钟等......

例子

当前时间为 15:28:07,较大的间隔边界为 15:30:00

当前时间为 03:00:00,较大的间隔边界为 03:05:00

当前时间为 23:59:59,较大的间隔边界为

00:00:00

我试过什么

我浏览了一堆帖子,但几乎所有帖子都有用户预定义的时间。这是我的草稿:

from datetime import datetime
now = datetime.now()
currentMin = now.minute 
# Some code to figure out what the larger interval boundary is
boundary = ?
target = datetime(now.year,now.month,now.date,now.hour,boundary)
duration = target-now
sleepTime = round(duration.total_seconds(),2)
time.sleep(sleepTime)
# Some other code

为了找到接下来的第 5 分钟,我有一个所有边界的列表,我计划运行循环以查看currentMin落入哪个间隔,然后将较大的间隔值分配给boundary

interval = [0,5,10,15,20,25,30,35,40,45,50,55,60]

问题

第一是效率,每次迭代从列表中抓取两个数字并与currentMin进行比较,但我的整个程序对时间非常敏感。

第二个是极端情况,我需要处理55 < currentMin < 60的情况,下一个第 5 分钟是第二天(示例中的最后一个情况(。

有没有更好的方法/简单的方法来实现这一目标?是否有内置命令可以帮助您轻松找到这样的时间标记。

由于您只对找到睡眠所需的时间感兴趣,因此这应该有效:

...
seconds = -(now.minute * 60 + now.second) % 300
sleep(seconds)

如果还想查找target,可以使用

target = now + timedelta(seconds=seconds)

您可以使用自Epoch 以来的秒数(由time.time()返回(通过以下基于模的计算有效地获取下一个 5 分钟标记的时间戳:

import time
from datetime import datetime
timestamp = time.time()
print(datetime.fromtimestamp(timestamp))
print(datetime.fromtimestamp(timestamp + 300 - timestamp % 300))

示例输出:

2019-08-28 16:38:57.435255
2019-08-28 16:40:00

您可以使用5 分钟的timedelta来计算将来的 5 分钟。这将考虑任何小时或日期的变化。然后四舍五入到最后 5 分钟。

from datetime import datetime, timedelta
now = datetime.now()
# go 5 minutes into the future
later5min = now + timedelta(0,0,0,0,5)
# round to 5 minutes
next5min = datetime(later5min.year, later5min.month, later5min.day, later5min.hour, 5*int(later5min.minute/5), 0, 0)
print(now)
print(next5min)

睡觉时,请使用

sleep((next5min-now).total_seconds())

这将休眠,包括几分之一秒。

"整个程序对时间非常敏感">

请注意,在 Windows 上,进程调度仅每 17 毫秒发生一次,因此您的程序永远不会比这更精确。我无法判断Linux。

根据您的示例,实际日期/时间似乎并不重要,重要的是距离下一个第 5 分钟还有多少秒。在这种情况下,您可以尝试如下操作:

from datetime import datetime
now = datetime.now()
current_min = now.minute
current_seconds = now.second
# get how many minutes past the previous 5th minute using modulus division
# eg if currentMin is 36, 36 % 5 = 1
time_past_previous_5_min = current_min % 5
# calculate how many minutes to the next 5th minute
next_5th_min = 5 - time_past_previous_5_min
# convert to seconds
seconds = next_5th_min * 60 - current_seconds
# sleep
time.sleep(seconds)

最新更新