【问题标题】:Time/Date based suppression system基于时间/日期的抑制系统
【发布时间】:2013-08-03 09:46:36
【问题描述】:

我们正在编写一个解析基于时间的事件的系统,我们希望为这些事件实现一个抑制系统,我们可以提供类似 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"

所以我需要以一种可以存储在表格中的格式来表示时间表,然后将列与当前时间组件进行匹配。

【问题讨论】:

  • 我希望这可以帮助docs.python.org/2/library/sched.html
  • @NikhilRupanawar 不幸的是没有。正如我提到的,我不是在安排活动,更像是测试时间是否与给定的时间表匹配。
  • 如果我理解正确,您只想将给定时间与一组时间模式进行比较,并检查它是否匹配其中一个或多个。直接的方法是将您给定的时间转换为datetime 对象,然后检查该对象的约束,例如d.weekday() in (4, 5, 6) and d.hour == 10。为什么不可能?

标签: python datetime suppression


【解决方案1】:

我建议您自己简单地实现您的时间模式检查器。使用datetime 对象之类的东西非常简单(如果您更喜欢,也可以使用time)。在 Python 语法中,您甚至可以表达“分钟、小时和秒数之和应为 42”之类的内容,即。 e.使用类似 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)

【讨论】:

  • 谢谢,这或多或少是我的想法 - 我的问题,对不起,我应该更清楚,我需要一个函数来根据定义的时间表列表测试比赛,例如存储在数据库中的时间表。我将编辑我的原始问题以反映。
  • 所以你需要①一种语言来表达你的调度规则(例如,类似于 cron tab 语言),②该语言的解析器(即 Python 库,将其翻译成 Python 表达式,如在我的回答中),以及③根据这些计算规则测试给定时间的设施。这更像是一项编程任务,而不仅仅是一个适合 SO 的问题,我担心 ;-)
  • 起初我并不认为它会如此复杂,但当你把它们拼凑在一起时,它似乎确实是一个挑战。再一次,我也认为这种类型的事情会很常见(我在我的工作中看到很多软件可以让你设置忽略/抑制事件的时间表)所以我希望有一个库可以将时间与时间表进行比较(用任何语言,因为我可以将它移植到 Python)。猜猜这不太常见!
  • 你可能是对的。我只是不适合接听您对此类图书馆的要求:-}
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多