您的位置:首页 > 手游攻略 > NCrontab:实践指南

NCrontab:实践指南

作者:互联网  时间: 2026-09-12 16:00:02  

真正理解NCrontab,要从它处理的任务开始:.NET 的 Crontab。一旦进入日常自动化环节,输入边界、依赖和失败处理如果不清楚就很难稳定复用会直接影响交付,这也是我最关心的风险。我的评估方法是用一项范围明确的真实任务完成最小试跑,然后检查配置时间、输出质量、异常信息和维护痕迹是否与文档一致。它更像给愿意先做小范围验证并复查原始文档的团队准备的可审查方案,是否长期使用应由试跑数据决定。

NCrontab:.NET 的 Crontab

![Build Status][build-badge] ![NuGet][nuget-badge]

NCrontab 是一个针对 .NET 标准库 1.0 的库, 有助于:

  • crontab 表达式的解析
  • crontab 表达式的格式
  • 根据 crontab 计划计算出现的时间

它_不_提供任何调度程序,或者不是像 cron 这样的调度工具 Unix 平台。它提供的是解析、格式化和算法 根据 crontab 中表示的给定时间表生成时间的出现 格式:

* * * * *
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 6)(星期日=0)
| | | +-------- 月份 (1 - 12)
| | +--------- 一个月中的某一天 (1 - 31)
| +------------ 小时 (0 - 23)
+------------- 分钟 (0 - 59)

或允许几秒钟的六部分格式:

* * * * * *
- - - - - -
| | | | | |
| | | | | +--- 星期几 (0 - 6)(星期日=0)
| | | | +----- 月份 (1 - 12)
| | | +-------- 一个月中的某一天 (1 - 31)
| | +--------- 小时 (0 - 23)
| +------------ 分钟 (0 - 59)
+------------- 秒 (0 - 59)

上面值字段中的星号 (*) 表示括号中的所有合法值 那个专栏。因此,值字段可以具有 * 或元素列表 用逗号分隔。元素可以是上面显示的范围内的数字,也可以是 该范围内的两个数字由连字符分隔(表示包含范围)。对于 更多,请参见CrontabExpression。

时间表示例:

表达 描述
<em> </em> <em> </em> * 每分钟
0 <em> </em> <em> </em> 每小时
0 0 <em> </em> * 每天半夜
0 9 <em> </em> Mon-Fri 工作日 9 AM
0 0 1 <em> </em> 每个月的第一天
0 <em>/6 </em> <em> </em> 每 6 小时
0 9-17 <em> </em> * 从 9 AM 到 5 PM 每小时

安装

使用以下命令将包添加到您的 .NET 项目中:

dotnet add package NCrontab

快速入门

using NCrontab;

var schedule = CrontabSchedule.Parse("0 12 * * Mon"); // Every Monday at noon
var next = schedule.GetNextOccurrence(DateTime.Now);

请注意,传递给 GetNextOccurrence 的开始时间是_独占_,因此如果 开始时间正好是预定的发生时间,下一个发生时间将是 之后的一张。这种设计允许您提供 GetNextOccurrence 的结果 返回自身以获取后续事件,例如,作为循环的一部分。

CrontabSchedule.Parse 解析的默认格式是由五部分组成的 cron 格式。为了使用包含秒的六部分格式,请传递 CrontabSchedule.ParseOptionsParse,其中 IncludingSeconds 设置为 true。例如:

var s = CrontabSchedule.Parse("0,30 * * * * *",
                              new CrontabSchedule.ParseOptions
                              {
                                  IncludingSeconds = true
                              });

获取出现次数

CrontabSchedule.GetNextOccurrences 生成时间表的出现。的 以下示例:

using System;
using NCrontab;

var s = CrontabSchedule.Parse("0 12 * */2 Mon"); // Monday of every other month
var start = new DateTime(2000, 1, 1);            // Starting January 1, 2000
var end = start.AddYears(1);                     // Through the year 2000

var occurrences = s.GetNextOccurrences(start, end);

Console.WriteLine(string.Join(Environment.NewLine,
                  from t in occurrences
                  select $"{t:ddd, dd MMM yyyy HH:mm}"));

将打印时间表 0 12 * */2 Mon 的出现次数(即 12:00 PM 每隔一个月的星期一),从 2000 年 1 月开始一直到这一年 年份:

Mon, 03 Jan 2000 12:00
Mon, 10 Jan 2000 12:00
Mon, 17 Jan 2000 12:00
Mon, 24 Jan 2000 12:00
Mon, 31 Jan 2000 12:00
Mon, 06 Mar 2000 12:00
Mon, 13 Mar 2000 12:00
Mon, 20 Mar 2000 12:00
Mon, 27 Mar 2000 12:00
Mon, 01 May 2000 12:00
Mon, 08 May 2000 12:00
Mon, 15 May 2000 12:00
Mon, 22 May 2000 12:00
Mon, 29 May 2000 12:00
Mon, 03 Jul 2000 12:00
Mon, 10 Jul 2000 12:00
Mon, 17 Jul 2000 12:00
Mon, 24 Jul 2000 12:00
Mon, 31 Jul 2000 12:00
Mon, 04 Sep 2000 12:00
Mon, 11 Sep 2000 12:00
Mon, 18 Sep 2000 12:00
Mon, 25 Sep 2000 12:00
Mon, 06 Nov 2000 12:00
Mon, 13 Nov 2000 12:00
Mon, 20 Nov 2000 12:00
Mon, 27 Nov 2000 12:00

合并时间表

NCrontab 可以合并一个或多个计划的_不同_时间线。这个可以 有时当无法用一个单一的表达时间表时会派上用场 crontab 表达式如_每 6 小时从 9 AM 到 5 PM,在工作日,但在 周末中午_。将其分为两个时间表:

  • 0 12 * * Sat-Sun:周末中午
  • 0 9-17/6 * * Mon-Fri:工作日9点AM到5点PM每6小时一班

您可以将它们合并以生成单个时间线:

using System;
using NCrontab;

var start = new DateTime(2000, 1, 1);
var end = start.AddYears(1);
var schedules = new[]
{
    CrontabSchedule.Parse("0 12 * * Sat-Sun"),
    CrontabSchedule.Parse("0 9-17/6 * * Mon-Fri")
};
var occurrences = schedules.GetNextOccurrences(start, end);
Console.WriteLine(string.Join(Environment.NewLine,
                              from t in occurrences
                              select $"{t:ddd, dd MMM yyyy HH:mm}"));

运行的输出将:

Sat, 01 Jan 2000 12:00
Sun, 02 Jan 2000 12:00
Mon, 03 Jan 2000 09:00
Mon, 03 Jan 2000 12:00
Mon, 03 Jan 2000 15:00
Tue, 04 Jan 2000 09:00
Tue, 04 Jan 2000 12:00
Tue, 04 Jan 2000 15:00
Wed, 05 Jan 2000 09:00
Wed, 05 Jan 2000 12:00
Wed, 05 Jan 2000 15:00
Thu, 06 Jan 2000 09:00
Thu, 06 Jan 2000 12:00
Thu, 06 Jan 2000 15:00
Fri, 07 Jan 2000 09:00
Fri, 07 Jan 2000 12:00
Fri, 07 Jan 2000 15:00
Sat, 08 Jan 2000 12:00
Sun, 09 Jan 2000 12:00
...

如果两个或多个计划产生相同的事件,则只有其中一个发生 被返回。

本产品包含由OpenSymphony Group开发的软件。

最新游戏

更多

Copyright©2010-2019. All rights reserved | 波波三国游戏官网|[email protected]

备案编号:湘ICP备2022015115号-4