【问题标题】:Custom Timer to get the seconds to the next start time/date自定义计时器以获取下一个开始时间/日期的秒数
【发布时间】:2012-06-08 17:05:49
【问题描述】:

我有一个项目,我指定了一周中的某些日子要运行,而其他未包含的日子应该跳过。例如:

工作日:周一 (0)、周二 (1)、周三 (2)、周四 (3)、周五 (4) 休息日:周六 (5)、周日 (6)

我在注册表中保存了几天的设置,当这些设置被提取时,它们会被它们的工作日编号引用。

如果我想让我的应用在周五 (4) 进入睡眠状态,并让它在周一 (0) 唤醒,我该怎么做?我无法确定休息日是否会保持一致,可能是周日/周一而不是周六/周日。

理想情况下,我需要查看当前的工作日数,看看它是否在天数列表中,如果不在,让它计算直到第二天开始的秒数。

场景:

  1. 我将脚本设置为在 6 月 8 日星期五进入睡眠状态,而星期六/星期日是休息日,我如何计算这两天的睡眠秒数,以便在 11 日星期一重新开始?

  2. 我将脚本设置为在 6 月 6 日星期三进入睡眠状态,我需要它在 6 月 8 日星期五醒来,然后在星期五晚上将其关闭,以便在星期一早上重新开始。

因为天数是可变的,所以这个函数必须能够适应它;这就是我遇到问题的地方。

任何帮助将不胜感激,在此先感谢!

【问题讨论】:

  • 您在哪个平台上,或者在这方面应该是通用的?我想说这是 *nix 上的 cron 工作。

标签: python date time timer


【解决方案1】:

每天检查一次 - 如果今天不是 On 日,请继续睡觉直到明天。

使用 cron(或 Windows 任务计划程序)将程序安排到所需的日期。

import datetime
from time import sleep

SECONDS_PER_DAY = 3600 * 24
DAILY_START_TIME = datetime.time(8,15)   # 8:15 am

def seconds(t):
    return 3600*t.hour + 60*t.minute + t.second

def now():
    t = datetime.datetime.now()
    return t.weekday(), seconds(t)

def load_run_days():
    # get data from registry
    return [1,1,1,1,1,0,0]

def days_until_next_run(today, run_days=None):
    if run_days is None:
        run_days = load_run_days()
    # rotate
    run_days = run_days[today+1:] + run_days[:today+1]
    # find next On day
    for days,_on in enumerate(run_days, 1):
        if _on:
            return days
    # no run day found?
    raise ValueError("No 'On' days found")

def sleep_until_next_run():
    today, elapsed = now()
    days_to_wait = days_until_next_run(today)
    sleep(-elapsed + days_to_wait*SECONDS_PER_DAY + seconds(DAILY_START_TIME))

def main():
    while True:
        try:
            sleep_until_next_run()
        except ValueError:
            break

        do_my_stuff()

if __name__=="__main__":
    main()

【讨论】:

    【解决方案2】:
    # Assume this is retrieved from registry
    runningOn[0] = True # Monday
    runningOn[1] = True
    runningOn[2] = True
    runningOn[3] = True
    runningOn[4] = True
    runningOn[5] = True
    runningOn[6] = True # Sunday
    
    # Get current day of week
    import datetime
    currentDayOfWeek = datetime.datetime.now().weekday()
    
    # How much time should we sleep?
    sleepDays = 1 # at least a day
    for i in range(1, 6):
        if runningOn[(i + currentDayOfWeek) % 7]:
            break
        sleepDays += 1
    
    # Run code, if necessary
    if runningOn[currentDayOfWeek]:
        doWhatever()
    
    # Sleep
    sleep(sleepDays * 24 * 3600)
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2016-05-30
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多