评估复杂的时间模式
Evaluate complex time patterns
我想定义和评估一些 CRON 表达式无法轻松处理的非常复杂的时间模式的出现。有没有图书馆可以帮助我做到这一点?
例如:
- 我希望它每 25 秒发生一次。
- 我只想在一个月的第一天和最后一天发生。但是一个月的第一天应该让我在 9:00AM 和 11:00AM 之间确定 5 分钟。月份的最后一天应评估为 5:00AM.
我想创建非常复杂的时间模式来执行如下操作:
每月第一周和第三周的星期一,时间介于 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 会更好。
我想定义和评估一些 CRON 表达式无法轻松处理的非常复杂的时间模式的出现。有没有图书馆可以帮助我做到这一点?
例如:
- 我希望它每 25 秒发生一次。
- 我只想在一个月的第一天和最后一天发生。但是一个月的第一天应该让我在 9:00AM 和 11:00AM 之间确定 5 分钟。月份的最后一天应评估为 5:00AM.
我想创建非常复杂的时间模式来执行如下操作:
每月第一周和第三周的星期一,时间介于 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 会更好。