.NET 全能 Cron 解析库 TimeCrontab v3.0.0 发布


序言

在重构 Furion 的定时任务模块时发现 Hangfire 开源的 Cron 解析工具类不够强大:不支持星期,不支持完整的 Cron 表达式解析翻遍了 Github 和 Nuget 没找到一个完完整整支持 Cron 的 .NET 库

所以,机会来了。😊


TimeCrontab

license nuget dotNET China

 

.NET 全能 Cron 表达式解析库,支持 Cron 完整特性。

TimeCrontab.drawio

特性

  • 支持 Cron 完整特性
  • 超高性能
  • 易拓展
  • 很小,仅 4KB
  • 无第三方依赖
  • 跨平台
  • 高质量代码和良好单元测试
  • 支持 .NET Framework 3.5+ 及后续版本

安装

  • Package Manager
Install-Package TimeCrontab
  • .NET CLI
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);

Macro 标识符

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 文档。

贡献

该存储库的主要目的是继续发展 TimeCrontab 核心,使其更快、更易于使用。TimeCrontab 的开发在 Gitee 上公开进行,我们感谢社区贡献错误修复和改进。

测试

支持 .NET Framework 3.5+ 及后续版本(含 .NET Core +,.NET 5+)

using System;
using Xunit;

namespace TimeCrontab.UnitTests;

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"));
}
}

许可证

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.

相關推薦

2022-11-15

TimeCrontab 是为 Furion 全新的定时任务准备的,将在本周发布分布式毫秒级定时任务。 TimeCrontab    .NET 全能 Cron 表达式解析库,支持 Cron 所有特性。 特性 支持 Cron 所有特性 超高性能 易拓展 很小,仅 4KB

2022-11-25

tps://gitee.com/dotnetchina/Jaina 😊 .NET 全能 Cron 表达式解析 TimeCrontab 作者:https://gitee.com/dotnetchina/TimeCrontab 😊 曾经风靡一时的 Hui 框架作者:https://gitee.com/monksoul/Hui 😊 曾经被 NodeJS 官方推荐的 Monk.Node 框架作者:https://gitee.co

2022-09-15

,却提供了足够强大的功能: 命令行参数与配置文件解析库(flag) 高性能日志库(log) 单元测试框架(unitest) go-style 协程 基于协程的网络编程框架 高效 JSON 库 基于 JSON 的 RPC 框架 面向玄学编程 原子操作(atomic) 随机

2023-12-13

Jarboot 是一个强大的 Java 进程管理、诊断的平台,可以在线管理、监控及诊断本地和远程的 Java 进程。 官方文档:www.yuque.com/jarboot 3.0.0(12,2023) 3.0.0跨越式升级,新增暗黑主题,支持主题跟随系统变化,集群模式支持,多个

2023-01-09

go-mir v3.0.0 发布了,v3版本带来全新的RESTful API开发方式,提供媲美gRPC服务开发的体验,方便快捷,欢迎参考使用。 ​Mir 是一套提供类似gRPC服务开发体验的快速开发RESTful API后端开发脚手架,适配多种HTTP框架,包括Gin, Chi, Hert

2024-06-28

er数量异常的问题。 解决了upstream中,配置ip的server会被解析成域名和ip的问题。 解决了njet 向adc 注册模块reload 时报 open file error:/home/limin/conf/register.json 的问题 解决了Kv 固定字符串测试,执行put 操作时,get 查询到的auth_basic 值

2024-06-29

动态代理转发,可以通过API直接切换后端的集群,为蓝绿发布提供了另外的技术途径。至此, 结合"动态表达式location"实现灰度引流测试,在测试完成后,通过动态代理转发实现蓝绿切换,NJet为企业急需的关键业务无中断的滚动

2023-09-24

堂,凭什么开发 30 岁就要被干掉? Steam++ 3.0.0-rc.2 已经发布,Steam 工具箱 此版本更新内容包括: 公告 rc版本为测试版本,微软商店等待正式版本更新 更新说明 修复启动时最小化设置无效 修复 mafile 文件导入的令牌在

2023-03-14

合,使代码更简单 很小,仅 41KB 无第三方依赖,TimeCrontab 也是本人作品 可在 Windows/Linux/MacOS 守护进程部署 支持分布式、集群(多实例)部署 支持负载均衡(基于 TCP/IP) 高质量代码和良好单元测试 跨

2023-10-17

管理的模块。 网站配置:对配置管理模块的数据源动态解析与统一维护管理的模块。 通知公告:系统通知公告信息发布维护。 代码生成:一键生成模块CRUD的功能,包括后端和前端等相关代码。 案例演示:常规代码生成

2023-10-27

入时对nonce字段的处理 build_chain.sh 建链脚本-l参数支持解析域名 修复节点接收到USR1/USR2信号后导致boost log死锁问题 修复取默克尔证明时阻塞rpc请求的问题 升级描述 升级节点可执行程序 效果:修复bug,并带来稳定性、

2023-04-23

合,使代码更简单 很小,仅 41KB 无第三方依赖,TimeCrontab 也是本人作品 可在 Windows/Linux/MacOS 守护进程部署 支持分布式、集群(多实例)部署 支持负载均衡(基于 TCP/IP) 高质量代码和良好单元测试 跨

2022-10-27

RePlugin v3.0.0 现已发布。RePlugin 是一套完整的、稳定的、适合全面使用的,占坑类插件化方案,由 360 手机卫士的 RePlugin Team 研发,也是业内首个提出” 全面插件化 “(全面特性、全面兼容、全面使用)的方案。 此版本更新内

2023-05-04

【基础版】    🚨 Breaking Changes 重构 SearchBar 组件 重构接口请求,统一管理接口请求模块 移除 BatchActionBar 组件    🐞 Bug Fixes 修复主页无法引入请求 api 并使用的问题