2012-06-04 20 views
0

我有一個項目,我已經分配了一週的某些日子來運行,而其他未包括的日子應該被跳過。例如:自定義計時器以獲取到下一個開始時間/日期的秒數

天論:星期一(0),週二(1),三(2),週四(3),五(4) 天關:SAT(5),太陽(6)

我有設置保存在註冊表中的日期上,當設置被拉出時,它們被他們的工作日號碼引用。

如果我想讓我的應用程序在星期五(4)上睡覺,並讓它在星期一(0)上醒來,我該如何去做呢?我無法確定這些假期是否一致,可能會有太陽/星期一而不是星期六/太陽。

理想情況下,我需要查看當前的工作日號碼,看它是否在天數列表中,如果不在,是否計算直到第二天開始的秒數。

方案:

  1. 設置我的劇本去上週五6月8日睡覺,週六/週日是休息日,我該如何計算秒睡了那兩天,使其啓動又是11號?

  2. 我在6月6日星期三設置了我的腳本去睡覺,我需要它在6月8日星期五醒來,但是星期五晚上再把它關掉,讓它在週一早上再次開始。

因爲天是可變的,這個函數必須能夠適應它;這是我遇到我的問題的地方。

任何幫助將不勝感激,非常感謝提前!

+0

哪個平臺是你,或者是這應該是這方面的普及?我會說這是* nix上的'cron'作業。 – msvalkon

回答

1

每天檢查一次 - 如果今天不是一天,回去睡覺,直到明天。

OR

使用cron(或Windows任務調度程序)爲計劃需要幾天的程序。

OR

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() 
0
# 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) 
相關問題