2017-04-19 114 views
1

我想定義和評估CRON表達式無法輕鬆處理的一些非常複雜的時間模式的出現次數。有沒有任何圖書館可以幫助我做到這一點?評估複雜的時間模式

例如:

  1. 我想這是每25秒發生。
  2. 我想只發生在月的第一天和最後一天。但是,每個月的第一天應該在上午9點到上午11:00之間給我5分鐘的分辨率。每月的最後一天應評估至凌晨5:00。
  3. 我想創造非常複雜的時間圖案做這樣的事情:

    在每月第一週和第三週的週一變得8:30 AM和11:30 AM 週二的第二個星期日之間的時間第四周時間中午12:00

是否有可能以某種表達形式表達這些要求並評估它適合的日期?我應該使用什麼,在哪裏找到它?

回答

2

我是評估此類表達式的庫的作者。它是特定領域的語言,看起來有點像SQL,所以很多用戶應該熟悉它的語法。對於問題表達式:

我希望每隔25秒發生一次。

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

我想只有先發生,本月的最後一天。但是,每個月的第一天應該在上午9點到上午11:00之間給我5分鐘的分辨率。每月的最後一天應評估至凌晨5:00。

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' 

在每月第一週和第三週的週一下午12:00

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' 
得到8:30 AM和11:30 AM在週二和第二週和第四周週日的時間之間的時間

這裏值得指出的是,通常幾個月的週數可以不同地進行計算,沒有這樣做的標準方式,因此結果可能取決於所選擇的策略。 GetWeekOfMonth(string type)有改變策略的可選類型參數。

可以注意到,包含where零件的查詢允許在當前時間線上應用複雜的過濾器。您只需像在SQL中那樣編寫過濾器,但您將過濾時間軸,而不是數據。

有幾個內置函數可以幫助更快地設計新的查詢。也可以開發其他的過濾功能。見wiki默認可用。所有這些函數都是用純C#編寫的,添加自定義函數應該很容易。它在nuget上可用。我希望這個圖書館對社區有用。

我也做了cron評估器,它共享抽象,所以可以互換使用它,因爲有時使用cron會更好。

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