评估复杂的时间模式

Evaluate complex time patterns

我想定义和评估一些 CRON 表达式无法轻松处理的非常复杂的时间模式的出现。有没有图书馆可以帮助我做到这一点?

例如:

  1. 我希望它每 25 秒发生一次。
  2. 我只想在一个月的第一天和最后一天发生。但是一个月的第一天应该让我在 9:00AM 和 11:00AM 之间确定 5 分钟。月份的最后一天应评估为 5:00AM.
  3. 我想创建非常复杂的时间模式来执行如下操作:

    每月第一周和第三周的星期一,时间介于 8:30AM 和 11:30AM 之间 第二周和第四周时间的周二和周日在12:00PM

是否可以用某种表达方式来表达这样的要求,并评估它适合什么日期?我应该使用什么,在哪里可以找到它?

我是评估此类表达式的库的作者。它是领域特定的语言,看起来有点像 SQL,所以很多用户应该熟悉它的语法。对于询问的表达式:

I would like it to occur every 25 seconds.

repeat every 25 seconds start at '29.10.2017 01:55:00'

I would like to occur only first and last day of month. But first day of month should gets me resolution of 5 minutes betwen 9:00AM and 11:00AM. The last day of month should evaluate to 5:00AM.

repeat every minutes where 1 = 
    (case 
        when GetDay() = 1 and GetHour() between 9 and 11
        then GetMinute() % 5 = 0
        when IsLastDayOfMonth()
        then GetHour() = 5 and GetMinute() = 0 and GetSecond() = 0 
        else 0
    esac) start at '01.01.2017'

On monday of first and third week of month gets time between 8:30AM and 11:30AM On tuesday and sunday of second and fourth week time at 12:00PM

repeat every minutes where 1 = 
   (case 
       when GetWeekOfMonth() in (1,3) and GetDayOfWeek() = monday
       then GetTime() between Time(8, 30, 0) and Time(11, 30, 0)
       when GetWeekOfMonth() in (2,4) and GetDayOfWeek() in (tuesday, sunday)
       then GetTime() = Time(12, 0, 0)
       else 0
    esac) start at '01.04.2017'

这里值得指出的是,通常每个月的一周可以进行不同的计算,没有标准的方法可以做到这一点,因此结果可能会因选择的策略而异。 GetWeekOfMonth(string type) 具有改变策略的可选类型参数。

可以注意到,包含 where 部分的查询允许在当前时间轴上应用复杂的过滤器。您只需像在 SQL 中那样编写过滤器,但您将过滤时间轴,而不是数据。

几乎没有内置函数可以帮助更快地设计新查询。也可以开发其他过滤功能。请参阅 wiki 中的默认可用。所有这些函数都是用纯 C# 编写的,添加自定义函数应该很容易。它在 nuget 上可用。我希望这个库对社区有用。

我还制作了共享抽象的 cron 评估程序,因此可以互换使用它,因为有时使用 cron 会更好。

https://github.com/Puchaczov/TQL.RDL