后来自定义时间段

时间:2014-08-04 07:49:56

标签: cron laterjs

我使用laterjs来定义在外汇交易时间运行的自定义时间段。但是,我的自定义期间似乎计划在定义的时间段之外运行。我尝试在线搜索示例,但似乎没有多少与此库有关。我也看过nodecron,但cron语法似乎不支持我的要求,即每小时运行一个任务,从周一的X AM到周五的Y PM。这是我的调度程序代码:

later.forexWeek = {
  name: 'forex trading hours',
  range: later.h.range * 119,
  val: function(d) {
    return 0;
  },
  isValid: function(d, val) {
    return later.forexWeek.val(d) === val;
  },
  extent: function(d) { return [0, 1]; },
  start: function(d) {
    return later.date.next(
      later.Y.val(d), later.M.val(d), later.dw.val(1), 21
    );
  },
  end: function(d) {
    return later.date.prev(
      later.Y.val(d), later.M.val(d), later.dw.val(6), 20
    );
  },
  next: function(d, val) {
    return later.date.next(
      later.Y.val(d), later.M.val(d), later.D.val(d), later.H.val(d)
    );
  },
  prev: function(d, val) {
    return later.date.prev(
      later.Y.val(d), later.M.val(d), later.D.val(d), later.H.val(d)
    );
  }
};

var forexWeek = later.parse.recur().every().hour().on(0).customPeriod('forexWeek');
later.setInterval(function() {
  console.log(moment().format());
}, forexWeek);

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您并非真的需要为此类计划编写自定义时间段,Laterjs会直接支持。例如,如果您希望从星期一上午8点到星期五下午5点每小时运行一次,您将通过以下过程来制定时间表。

由于不同日期存在不同的约束,我们需要创建复合计划。复合调度基本上是不同约束集的组合,如果任何约束集有效,则使特定事件有效。在这种情况下,我们将有三组不同的约束:

 1. Once every hour on the hour on Mondays after 8 AM
 2. Once every hour on the hour on Tuesdays, Wednesdays, Thursdays
 3. Once every hour on the hour on Fridays before and including 5PM

现在我们可以为每个人创建适当的时间表。由于Laterjs计划只是JSON对象,因此我只是使用http://bunkat.github.io/later/time-periods.html#overview中定义的约束手动创建计划。使用Recur解析器也可以生成相同的计划。

翻译我们之前定义的时间表:

 1. {dw: [2], h_a:[8], m:[0], s:[0]}
 2. {dw: [3,4,5], m:[0], s:[0]}
 3. {dw: [6], h_b:[18], m:[0], s:[0]}

如果我们采取第一个并将其分解,则明确指出当星期几(dw)值为2(星期一)时小时值大于或等于时,应认为时间有效(h_a)8,当分钟值(m)等于0时,以及当第二个值(s)等于0.任何满足所有这些约束的时间都将由该时间表返回。如果我们看一些例子,可能会更清楚。

Mon Aug 11 2014 18:00:00 GMT-0700 (Pacific Daylight Time)

 - Day of week is 2
 - Hour is 18
 - Minute is 0
 - Second is 0

This is a valid time and would be returned.

Mon Aug 11 2014 7:00:00 GMT-0700 (Pacific Daylight Time)

 - Day of week is 2
 - Hour is 7

 Hour is not valid, this time would not be returned.

另外两个可以用同样的方式来推理。现在我们需要做的就是将它们放入一个复合计划中,基本上将它们组合在一起,以便满足任何计划的时间都被视为有效。

var s = {schedules: [
    {dw: [2], h_a:[8], m:[0], s:[0]},
    {dw: [3,4,5], m:[0], s:[0]},
    {dw: [6], h_b:[18], m:[0], s:[0]}
]};

现在您可以找到未来(或过去的事件):

later.schedule(s).next(100)