【问题标题】:Check the time difference between the current time and the next 5th minute检查当前时间与下一个 5 分钟之间的时差
【发布时间】:2019-08-28 23:16:10
【问题描述】:

已编辑(澄清我的目的)

我需要写一个函数,将一个小时分成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进行比较,但我的整个程序对时间非常敏感。

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

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

【问题讨论】:

    标签: python loops datetime


    【解决方案1】:

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

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

    如果你也想找到target,可以使用

    target = now + timedelta(seconds=seconds)
    

    【讨论】:

    • 此方法快速简单,但例如时间为12:00时,睡眠时间将是0s而不是300s。在这种情况下,我可以添加一个 if 语句来使睡眠时间等于 300 秒。但是,对于我的程序,我认为 sleep 0s 工作得很好。谢谢!
    • 如果是12:00:00,时间已经是5分钟的倍数了。为什么还要再等 5 分钟?
    • 我正在实现一个需要这种机制的程序。
    【解决方案2】:

    您可以使用 time.time() 返回的自 Epoch 以来的秒数,通过以下基于模的计算有效地获取下一个 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
    

    【讨论】:

    • 这适用于任何情况!非常感谢!
    【解决方案3】:

    您可以使用 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。

    【讨论】:

    • 我正在运行 Linux,我读过一些帖子说 Linus 滴答声接近 1 毫秒,但仍然很大程度上取决于您当时正在运行的其他程序。感谢您的回复!
    【解决方案4】:

    根据您的示例,实际日期/时间似乎并不重要,只是距离下一个 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)
    

    【讨论】:

    • 这样,你只睡了整整几分钟。它不会在 hh:mm:00 之前休眠几秒钟。
    • 已更新以处理秒数
    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 2021-04-13
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多