2013-08-02 39 views
0

我們正在對一個解析基於時間的事件的系統進行編碼,並且我們希望爲這些事件實施一個抑制系統,我們可以爲這些事件提供類似cron的語法來進行匹配。基於時間/日期的抑制系統

例如如果抑制...

  1. ..事件上月
  2. 的最後一個星期五發生..事件下午4點到下午5點平日
  3. 之間發生..事件發生在星期天

等等。

我們正在使用Python,所以我希望可能有一個模塊來做這種事情,但是我的搜索技巧讓我失望(很多關於調度事件的結果,而我想要的卻是相反的 - 當前時間匹配定義的時間表)。

另外,我很高興從頭開始寫一個,如果任何人有任何建議,最好的方式來存儲和比較時間表與時間。

編輯:

爲了澄清,抑制時間表不是一成不變的,所以我不能簡單地編寫一個函數來處理具體案件。時間表需要存儲在數據庫中,並依賴於一個事件,所以我可以大致做:

sql_rows = ..... "SELECT * FROM suppressions WHERE event_id = ?" 

for row in sql_rows: 
    if matchesSchedule(current_time,row): 
     print "This should be suppressed" 

所以我需要來表示我可以在表中存儲格式的時間表,再搭配針對當前時間組件的列。

+0

我希望這可以幫助http://docs.python.org/2/library/sched.html –

+0

@NikhilRupanawar遺憾的是沒有。正如我所提到的,我不是安排活動,更像是測試時間是否符合給定的時間表。 – AndyC

+0

如果我正確地理解了你,你只是想將給定的時間與一組時間模式進行比較,並檢查它是否與一個或多個時間模式匹配。直接的方法是將給定的時間轉換爲日期時間對象,然後檢查該對象的約束條件,例如(4,5,6)中的d.weekday()和d.hour == 10'。爲什麼不可能? – Alfe

回答

0

我建議你自己簡單地實現你的時間模式檢查器。這很簡單,就像datetime對象一樣(如果你更喜歡,你也可以使用time)。在Python語法中,你甚至可以表達諸如「分鐘數,小時數和秒數的總和應爲42」之類的東西,即i。即使用類似cron的模式是不可能的。

import datetime 

def matchesTimePattern1(d): 
    return (
    d.weekday() == 4 and # Friday? 
    d.month != (d + datetime.timedelta(7)).month # next week is different month? 
) 

def matchesTimePattern2(d): 
    return (
    d.weekday() in (0, 1, 2, 3, 4) and # weekday? 
    d.hour == 16 # at 4pm (up to 4:59:59pm) 
) 

def matchesTimePattern3(d): 
    return (
    d.weekday() == 6 # Sunday? 
) 

d = datetime.datetime.now() 
print matchesTimePattern1(d) 
print matchesTimePattern2(d) 
print matchesTimePattern3(d) 
+0

謝謝,這或多或少是我想到的 - 我的問題,對不起,我應該更清楚一點,就是我需要一個函數來根據定義的時間表列表來測試比賽,例如,計劃存儲在數據庫中。我會編輯我的原始問題以反映。 – AndyC

+1

所以你需要①一種語言來表達你的調度規則(例如類似於cron選項卡語言),②該語言的解析器(即Python庫,將它翻譯成我的答案中的Python表達式),③根據這些計算規則測試給定時間的設施。這更像是一個編程任務,而不僅僅是一個適合SO的問題,我擔心;-) – Alfe

+0

起初我並不認爲它會如此複雜,但是當你將它們拼湊在一起時,這看起來確實是一個挑戰。然後我再次認爲這種類型的事情會非常普遍(我看到我的工作中有很多軟件可以讓你設置忽略/抑制事件的時間表),所以我希望有一個用於比較時間表和時間表的庫(任何語言,因爲我可以將它移植到Python)。猜猜它不是太常見! – AndyC