TimeCrontab.NET 全能 Cron 表達(dá)式解析庫
TimeCrontab 是 .NET 全能 Cron 表達(dá)式解析庫,支持 Cron 完整特性。
特性
- 支持 Cron 所有特性
- 超高性能
- 易拓展
- 很小,僅
4KB - 無第三方依賴
- 跨平臺
- 高質(zhì)量代碼和良好單元測試
- 支持
.NET Framework 3.5+及后續(xù)版本
安裝
Install-Package TimeCrontab
dotnet add package TimeCrontab
快速入門
我們在主頁上有不少例子,這是讓您入門的第一個:
常規(guī)格式:分 時 天 月 周
var crontab = Crontab.Parse("* * * * *"); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
支持年份:分 時 天 月 周 年
var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithYears); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
支持秒數(shù):秒 分 時 天 月 周
var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
支持秒和年:秒 分 時 天 月 周 年
var crontab = Crontab.Parse("* * * * * * *", CronStringFormat.WithSecondsAndYears); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
獲取休眠差實(shí)現(xiàn)定時任務(wù)
// 阻塞方式 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); while(true) { Thread.Sleep(crontab.GetSleepMilliseconds(DateTime.UtcNow)); Console.WriteLine(DateTime.Now.ToString("G")); } // 無阻塞方式 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); Task.Factory.StartNew(async () => { while (true) { await Task.Delay(crontab.GetSleepMilliseconds(DateTime.UtcNow)); Console.WriteLine(DateTime.Now.ToString("G")); } }, TaskCreationOptions.LongRunning);
BackgroundService 實(shí)現(xiàn)定時任務(wù)
using TimeCrontab; namespace WorkerService; public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; private readonly Crontab _crontab; public Worker(ILogger<Worker> logger) { _logger = logger; _crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var taskFactory = new TaskFactory(System.Threading.Tasks.TaskScheduler.Current); await taskFactory.StartNew(async () => { // 你的業(yè)務(wù)代碼寫到這里面 _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.CompletedTask; }, stoppingToken); await Task.Delay(_crontab.GetSleepMilliseconds(DateTime.UtcNow), stoppingToken); } } }
Macro 標(biāo)識符
var secondly = Crontab.Secondly; // 每秒 var minutely = Crontab.Minutely; // 每分鐘 var hourly = Crontab.Hourly; // 每小時 var daily = Crontab.Daily; // 每天 00:00:00 var monthly = Crontab.Monthly; // 每月 1 號 00:00:00 var weekly = Crontab.Weekly; // 每周日 00:00:00 var yearly = Crontab.Yearly; // 每年 1 月 1 號 00:00:00
文檔
您可以在主頁找到 TimeCrontab 文檔。
測試
public class TimeCrontabUnitTests { [Theory] [InlineData("* * * * *", "* * * * *", CronStringFormat.Default)] [InlineData("0 0 31W * *", "0 0 31W * *", CronStringFormat.Default)] [InlineData("0 23 ? * MON-FRI", "0 23 ? * 1-5", CronStringFormat.Default)] [InlineData("*/5 * * * *", "*/5 * * * *", CronStringFormat.Default)] [InlineData("30 11 * * 1-5", "30 11 * * 1-5", CronStringFormat.Default)] [InlineData("23 12 * JAN *", "23 12 * 1 *", CronStringFormat.Default)] [InlineData("* * * * MON#3", "* * * * 1#3", CronStringFormat.Default)] [InlineData("*/5 * L JAN *", "*/5 * L 1 *", CronStringFormat.Default)] [InlineData("0 0 ? 1 MON#1", "0 0 ? 1 1#1", CronStringFormat.Default)] [InlineData("0 0 LW * *", "0 0 LW * *", CronStringFormat.Default)] [InlineData("0 30 10-13 ? * WED,FRI", "0 30 10-13 ? * 3,5", CronStringFormat.WithSeconds)] [InlineData("0 */5 * * * *", "0 */5 * * * *", CronStringFormat.WithSeconds)] [InlineData("0 0/1 * * * ?", "0 */1 * * * ?", CronStringFormat.WithSeconds)] [InlineData("5-10 30-35 10-12 * * *", "5-10 30-35 10-12 * * *", CronStringFormat.WithSeconds)] public void TestParse(string expression, string outputString, CronStringFormat format) { var output = Crontab.Parse(expression, format).ToString(); Assert.Equal(outputString, output); } [Theory] [InlineData("* * * * *", "2021-01-01 00:01:00", CronStringFormat.Default)] [InlineData("0 0 31W * *", "2021-01-29 00:00:00", CronStringFormat.Default)] [InlineData("0 23 ? * MON-FRI", "2021-01-01 23:00:00", CronStringFormat.Default)] [InlineData("*/5 * * * *", "2021-01-01 00:05:00", CronStringFormat.Default)] [InlineData("30 11 * * 1-5", "2021-01-01 11:30:00", CronStringFormat.Default)] [InlineData("23 12 * JAN *", "2021-01-01 12:23:00", CronStringFormat.Default)] [InlineData("* * * * MON#3", "2021-01-18 00:00:00", CronStringFormat.Default)] [InlineData("*/5 * L JAN *", "2021-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 0 ? 1 MON#1", "2021-01-04 00:00:00", CronStringFormat.Default)] [InlineData("0 0 LW * *", "2021-01-29 00:00:00", CronStringFormat.Default)] [InlineData("0 30 10-13 ? * WED,FRI", "2021-01-01 10:30:00", CronStringFormat.WithSeconds)] [InlineData("0 */5 * * * *", "2021-01-01 00:05:00", CronStringFormat.WithSeconds)] [InlineData("0 0/1 * * * ?", "2021-01-01 00:01:00", CronStringFormat.WithSeconds)] [InlineData("5-10 30-35 10-12 * * *", "2021-01-01 10:30:05", CronStringFormat.WithSeconds)] public void TestGetNextOccurence(string expression, string nextOccurenceString, CronStringFormat format) { var beginTime = new DateTime(2021, 1, 1, 0, 0, 0); var crontab = Crontab.Parse(expression, format); var nextOccurence = crontab.GetNextOccurrence(beginTime); Assert.Equal(nextOccurenceString, nextOccurence.ToString("yyyy-MM-dd HH????ss")); } }
貢獻(xiàn)
該存儲庫的主要目的是繼續(xù)發(fā)展 TimeCrontab 核心,使其更快、更易于使用。TimeCrontab 的開發(fā)在 Gitee 上公開進(jìn)行,我們感謝社區(qū)貢獻(xiàn)錯誤修復(fù)和改進(jìn)。
許可證
TimeCrontab 采用 MIT 開源許可證。
MIT License Copyright (c) 2020-2022 百小僧, Baiqian Co.,Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
評論
圖片
表情
