2010-08-12 52 views
1

因此,我列出了一些類似於警報的事件。他們的起始和結束時間(以小時和分鐘爲單位),一系列的日期(即星期三到星期三的1-3)以及一個月的範圍(即1-3,一月到三月)定義。這些數據的格式在很大程度上是不可改變的。我需要,不一定要對列表進行排序,但我需要根據當前時間查找下一個即將發生的事件。有很多不同的方法可以做到這一點,還有很多不同的角落案例。這是我的僞代碼:對排定的事件進行排序python

 


now = time() 
diff = [] 
# Start difference between now and start times 
for s in schedule #assuming appending to diff 
    diff.minutes = s.minutes - time.minutes # 
    diff.hours = s.hours - time.hours 
    diff.days = s.days - time.days 
    diff.months = s.months - time.months 

for d in diff 
    if d < 0 
     d = period + d 
     # period is the maximum period of the attribute. ie minutes is 60, hours is 24 

# repeat for event end times 

 

所以,現在我有一個小時,分鐘,天和星期的差異元組列表。這個元組已經考慮到了它是否通過了開始時間,但是在結束時間之前。所以我們假設它是在八月份,事件的開始月份是七月份,結束月份是九月份,所以diff.month == 0。現在

這種特定的極端情況下,給我的麻煩:

比方說一個時間表從0到23:59週四在八月中運行。這是星期五27日。運行我的算法,幾個月的差異將爲0,但實際上它將不會再次運行,直到下一個8月份,所以它應該是12。這個月是我認爲的唯一問題,因爲這個月是唯一屬性,直接取決於具體月份的日期(而不僅僅是一天)。我的算法是否正常,我可以處理這種特殊情況?還是有更好的東西呢?

這是我與

map['start_time']='' 
    map['end_time']='' 
    map['start_moy']='' 
    map['end_moy']='' 
    map['start_dow']=''  
    map['end_dow']='' 

工作日程getAllSchedules方法只返回一個列表的所有時間表的數據。我可以更改課程表,但我不確定我可以在那裏做出什麼改變。我無法添加/更改我給出的時間表格式

+0

電池包括在內。使用日期時間數學。 http://docs.python.org/library/datetime.html – msw 2010-08-12 20:59:21

回答

1

將時間表中的項目轉換爲datetime對象。然後,你可以簡單地對它們進行排序

from datetime import datetime 
events = sorted(datetime(s.year, s.month, s.day, s.hour, s.minute) for s in schedule) 
+0

問題是預定的事件沒有與它關聯的實際日期,只是八月的星期四。如果我可以轉換爲日期時間,這將是不錯的,但沒有實際的日期,我仍然必須解決我目前有 – Falmarri 2010-08-12 21:00:36

+0

@Falmarri的問題,它仍然是最好的利用日期時間模塊,因爲這會照顧你的角落案件。你能爲你安排課程嗎? – 2010-08-12 21:05:42

+0

我也沒有年份屬性 – Falmarri 2010-08-12 21:07:33

1

由於您的分辨率以分鐘爲單位,並假設你沒有太多的事件,那麼我會簡單地掃描所有每分鐘的事件。

過濾您的活動,以便您有一個新的活動範圍與當前的月份和日期相匹配的列表。

然後,根據當前時間是否與事件範圍相匹配,對於這些事件中的每一個,聲明它們處於活動狀態或非活動狀態。

+0

我無法控制調度程序運行的頻率。我所要做的就是在下一次計劃的事件時詢問我 – Falmarri 2010-08-12 21:10:20

1

主要問題似乎是因爲您使用的是星期幾而不是明確的月份。

雖然您引用的邊緣案例就是一個例子,但是這個問題是否會在當前時間之外的任何月份安排所有事件?

我認爲這裏最穩健的方法是將您的預定事件轉換爲日期時間格式,然後使用@ gnibbler對排序日期時間對象的建議。

一旦確定當前月份的最後一個事件已經過去,計算事件發生的下一個月的距離(無論是+ 1年還是+ 1個月),然後構建一個日期時間對象利用這些信息:

first_of_month = datetime.date(calculated_year, calculated_month, 1) 

通過使用該月的第一天,你就可以使用:

day_of_week = first_of_month.strftime('%w') 

爲了讓你何日一週的第一當月落在,你可以用來計算要添加到第一個,第二個,第三次,例如當月的某一天。一旦你有了這一天,你就可以構建一個有效的對象,並使用now()做任何你想要的比較。

+1

這或多或少是我上面的算法做的。但是,這仍然錯過了在一個月內沒有更多的特定日子的情況 – Falmarri 2010-08-12 21:12:17

+0

編輯我的解決方案,以解決邊緣情況。 – Andrew 2010-08-12 22:05:10