2010-08-12 2 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, когда на самом деле он не будет работать снова до следующего августа, поэтому ему должно быть 12. И я застрял. Месяц - единственная проблема, о которой я думаю, потому что месяц является единственным атрибутом, который напрямую зависит от того, какова дата конкретного месяца (в отличие от дня). Мой алгоритм в порядке, и я могу просто справиться с этим специальным случаем? Или есть что-то лучше для этого?

Это данные я работаю с

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

Метод график getAllSchedules просто возвращает список для всех графиков. Я могу изменить класс расписания, но я не уверен, какая разница я могу там сделать. Я не могу добавить/изменить формат расписаний, которые мне даны

+0

Батареи включены. Используйте математику datetime. http://docs.python.org/library/datetime.html – msw

ответ

1

Конвертировать элементы из графика в datetime объектов. Тогда вы можете просто сортировать их

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

Проблема заключается в том, что запланированное событие не имеет фактической даты, связанной с ним, только в августе в августе. Если бы я мог конвертировать в datetime, что было бы неплохо, но без фактической даты, мне все равно пришлось бы решить проблему, с которой я в настоящее время имею – Falmarri

+0

@Falmarri. Все равно будет лучше использовать модуль datetime, поскольку это позаботится о вашем угловые случаи. Можете ли вы, чтобы код для вас планировал класс? –

+0

У меня также нет атрибута года – Falmarri

1

Поскольку ваше разрешение в течение нескольких минут, и при условии, что вы не имеете много событий, то я бы просто просмотреть все события, каждую минуту.

Отфильтруйте свои события так, чтобы у вас появился новый список, в котором диапазон событий соответствует текущему месяцу и дню.

Затем для каждого из этих событий объявляется, что они активны или неактивны в зависимости от того, соответствует ли текущее время диапазону события.

+0

У меня нет контроля над тем, как часто работает планировщик. Все, что мне нужно сделать, это дать ему следующее запланированное событие, когда оно спросит меня. – Falmarri

1

Основная проблема заключается в том, что вы используете день недели вместо явных дней месяца.

В то время как ваш приведенный пример края является одним из примеров, не возникает ли эта проблема со всеми событиями, запланированными в любой месяц за пределами текущего?

Я думаю, что самым надежным подходом здесь было бы сделать работу по получению запланированных событий в формате даты и времени, а затем использовать предложение gnibbler по сортировке объектов datetime.

Как только вы определили, что последнее событие за текущий месяц уже прошло, вычислите расстояние до следующего месяца, когда событие произойдет (пусть оно + 1 год или всего + 1 месяц), а затем постройте объект datetime с этой информацией:

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

при использовании в первый день месяца, вы можете использовать:

day_of_week = first_of_month.strftime('%w') 

Чтобы дать вам какой день недели первого числа этого месяца выпадает на, что вам может затем использовать для расчета количества дней, чтобы добавить, чтобы добраться до первого, второго, третий и т. д. экземпляр данного дня недели, за этот месяц. Как только у вас есть этот день, вы можете создать действительный объект datetime и выполнить любые сравнения, которые вы хотите, с помощью now().

+1

Это более или менее то, что делает мой алгоритм выше. Тем не менее, это все еще не учитывает случай, когда он находится в течение месяца, но не более определенного дня. – Falmarri

+0

Отредактировано мое решение исключительно для устранения случаев краев. – Andrew

Смежные вопросы