.NET 全能 Cron 表达式解析库 TimeCrontab v3.3.6
TimeCrontab
.NET 全能 Cron 表达式解析库,支持 Cron 所有特性。
特性
- 支持 Cron 所有特性
- 超高性能
- 易拓展
- 很小,仅
4KB
- 无第三方依赖
- 跨平台
- 高质量代码和良好单元测试
- 支持
.NET Framework 3.5+
及后续版本
安装
Install-Package TimeCrontab
dotnet add package TimeCrontab
快速入门
我们在主页上有不少例子,这是让您入门的第一个:
常规格式:分 时 天 月 周
var crontab = Crontab.Parse("* * * * *"); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
支持年份:分 时 天 月 周 年
var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithYears); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
支持秒数:秒 分 时 天 月 周
var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
支持秒和年:秒 分 时 天 月 周 年
var crontab = Crontab.Parse("* * * * * * *", CronStringFormat.WithSecondsAndYears); var nextOccurrence = crontab.GetNextOccurrence(DateTime.Now);
获取休眠差实现简单定时任务
// 阻塞方式 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); while(true) { Thread.Sleep(crontab.GetSleepMilliseconds(DateTime.Now)); Console.WriteLine(DateTime.Now.ToString("G")); } // 无阻塞方式 var crontab = Crontab.Parse("* * * * * *", CronStringFormat.WithSeconds); Task.Factory.StartNew(async () => { while (true) { await Task.Delay(crontab.GetSleepMilliseconds(DateTime.Now)); Console.WriteLine(DateTime.Now.ToString("G")); } }, TaskCreationOptions.LongRunning);
BackgroundService
实现简单定时任务
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 () => { // 你的业务代码写到这里面 _logger.LogInformation("Worker running at: {time}", DateTime.Now); await Task.CompletedTask; }, stoppingToken); await Task.Delay(_crontab.GetSleepMilliseconds(DateTime.Now), stoppingToken); } } }
Macro 标识符
// macro 字符串 var secondly = Crontab.Parse("@secondly"); // 每秒 var minutely = Crontab.Parse("@minutely"); // 每分钟 var hourly = Crontab.Parse("@hourly"); // 每小时 var daily = Crontab.Parse("@daily"); // 每天 00:00:00 var monthly = Crontab.Parse("@monthly"); // 每月 1 号 00:00:00 var weekly = Crontab.Parse("@weekly"); // 每周日 00:00:00 var yearly = Crontab.Parse("@yearly"); // 每年 1 月 1 号 00:00:00 var workday = Crontab.Parse("@workday"); // 每周一至周五 00:00:00 // 静态属性 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 var workday = Crontab.Workday; // 每周一至周五 00:00:00
Macro At 标识符
// 每第 3 秒 var crontab = Crontab.SecondlyAt(3); // 每第 3,5,6 秒 var crontab = Crontab.SecondlyAt(3, 5, 6); // 每分钟第 3 秒 var crontab = Crontab.MinutelyAt(3); // 每分钟第 3,5,6 秒 var crontab = Crontab.MinutelyAt(3, 5, 6); // 每小时第 3 分钟 var crontab = Crontab.HourlyAt(3); // 每小时第 3,5,6 分钟 var crontab = Crontab.HourlyAt(3, 5, 6); // 每天第 3 小时正(点) var crontab = Crontab.DailyAt(3); // 每天第 3,5,6 小时正(点) var crontab = Crontab.DailyAt(3, 5, 6); // 每月第 3 天零点正 var crontab = Crontab.MonthlyAt(3); // 每月第 3,5,6 天零点正 var crontab = Crontab.MonthlyAt(3, 5, 6); // 每周星期 3 零点正 var crontab = Crontab.WeeklyAt(3); var crontab = Crontab.WeeklyAt("WED"); // SUN(星期天),MON,TUE,WED,THU,FRI,SAT // 每周星期 3,5,6 零点正 var crontab = Crontab.WeeklyAt(3, 5, 6); var crontab = Crontab.WeeklyAt("WED", "FRI", "SAT"); // 还支持混合 var crontab = Crontab.WeeklyAt(3, "FRI", 6); // 每年第 3 月 1 日零点正 var crontab = Crontab.YearlyAt(3); var crontab = Crontab.YearlyAt("MAR"); // JAN(一月),FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC // 每年第 3,5,6 月 1 日零点正 var crontab = Crontab.YearlyAt(3); var crontab = Crontab.YearlyAt(3, 5, 6); var crontab = Crontab.YearlyAt("MAR", "MAY", "JUN"); // 还支持混合 var crontab = Crontab.YearlyAt(3, "MAY", 6);
文档
您可以在主页找到 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("* * * * *", "2022-01-01 00:01:00", CronStringFormat.Default)] [InlineData("0 0 31W * *", "2022-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 23 ? * MON-FRI", "2022-01-03 23:00:00", CronStringFormat.Default)] [InlineData("*/5 * * * *", "2022-01-01 00:05:00", CronStringFormat.Default)] [InlineData("30 11 * * 1-5", "2022-01-03 11:30:00", CronStringFormat.Default)] [InlineData("23 12 * JAN *", "2022-01-01 12:23:00", CronStringFormat.Default)] [InlineData("* * * * MON#3", "2022-01-17 00:00:00", CronStringFormat.Default)] [InlineData("*/5 * L JAN *", "2022-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 0 ? 1 MON#1", "2022-01-03 00:00:00", CronStringFormat.Default)] [InlineData("0 0 LW * *", "2022-01-31 00:00:00", CronStringFormat.Default)] [InlineData("0 30 10-13 ? * WED,FRI", "2022-01-05 10:30:00", CronStringFormat.WithSeconds)] [InlineData("0 */5 * * * *", "2022-01-01 00:05:00", CronStringFormat.WithSeconds)] [InlineData("0 0/1 * * * ?", "2022-01-01 00:01:00", CronStringFormat.WithSeconds)] [InlineData("5-10 30-35 10-12 * * *", "2022-01-01 10:30:05", CronStringFormat.WithSeconds)] public void TestGetNextOccurence(string expression, string nextOccurenceString, CronStringFormat format) { var beginTime = new DateTime(2022, 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")); } }
贡献
该存储库的主要目的是继续发展 TimeCrontab 核心,使其更快、更易于使用。TimeCrontab 的开发在 Gitee 上公开进行,我们感谢社区贡献错误修复和改进。
许可证
TimeCrontab 采用 MIT 开源许可证。
本期更新
-
新特性
- [新增]
Crontab.IsValid(...)
静态方法,判断Cron
表达式是否有效 4.8.7.17 ⏱️2023.03.20 #I6OHO4 - [新增]
crontab.GetSleepTimeSpan(baseTime)
实例方法 4.8.4.10 ⏱️2023.01.09 #I69HM4 - [新增]
Crontab.ParseAt(..)
静态方法 4.8.2.6 ⏱️2022.11.30 035cc23 - [新增]
Crontab
所有Macro At
静态方法 4.8.2.6 ⏱️2022.11.30 a15b69d - [新增]
Crontab.Workday
表示周一至周五的Macro
静态属性 4.8.2.6 ⏱️2022.11.30 a15b69d
- [新增]
-
问题修复

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
.NET 分布式作业调度 Sundial v2.23
Sundial .NET 功能齐全的开源分布式作业调度系统,可从最小的应用程序到大型企业系统使用。 安装 dotnet add package Sundial 快速入门 我们在主页上有不少例子,这是让您入门的第一个: 定义作业,并实现IJob接口: public class MyJob : IJob { private readonly ILogger<MyJob> _logger; public MyJob(ILogger<MyJob> logger) { _logger = logger; } public Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) { _logger.LogInformation(context.ToString()); return Task.CompletedTask; } } 在Startup.cs注册AddSchedule服务和作业: services.AddSchedu...
- 下一篇
Firefox 121.0.1 发布
Firefox 121.0.1 现已发布,此版本进行了一些 bug 修复。具体更新内容如下: Fixed 修复了某些 CJK 上下文中因表意空间处理变化而导致的意外换行(Bug 1870973) 修复了在某些情况下加载包含基于列的布局的网站时的挂起问题(Bug 1867784) 修复了在另一个视频上播放的视频缺少圆角的问题(Bug 1869994) 修复了 Firefox 无法正确关闭以及其他应用程序在 Firefox 会话期间使用过 USB 安全密钥后无法使用的问题(Bug 1863135) 更新说明:https://www.mozilla.org/en-US/firefox/121.0.1/releasenotes/ 下载地址:https://www.mozilla.org/zh-CN/firefox/download/thanks/
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题