比较使用时刻的时间集合

我已经定义了一套规则。

var rules = [ { time : "12:00:00 pm", time1 : "01:00:00 pm", value:0 }, { time : "01:00:00 pm", time1 : "02:00:00 pm", value:0 }, { time : "02:00:00 pm", time1 : "03:00:00 pm", value:0 }, { time : "03:00:00 pm", time1 : "04:00:00 pm", value:0 }, { time : "04:00:00 pm", time1 : "05:00:00 pm", value:0 } ] module.exports = rules; 

现在我已经得到了一个数据数组,其中包括我想要将这些数据与这些规则进行比较,并相应地增加规则数组中状态的值。 我正在使用moment.Js进行比较,但它的isAfter()和isBefore函数不适合我,因为他们应该。

  _.each(data, function(data){ // this comes from database where data.start_time consists of time console.log(data.start_time); // Mon Oct 03 2016 12:40:36 GMT+0530 (India Standard Time) var d = moment(data.start_time).format("hh:mm:ss a"); console.log(d); //12:40:36 pm _.each(rules, function(rule){ console.log(rule.time); //12:00:00 pm if(moment(d).isAfter(rule.time)) { // Not able to reach here tried both isAfter // isBefore everything. console.log("sasa"); } }) }); 

另外,如果有更快或更好的方法做这种比较,请你可以留下下面的要点。 我也会检查一下。

我试图debugging你的代码,并有一些意见 –

  1. (d).isAfter – 在这里,时刻(d)没有一个叫做“isAfter”的方法。 这是一个奇怪的事情,因为它应该按照文档的方法。 我不得不调用下面的原型方法 –

     var protoType = moment(start_time).__proto__; var isafter = protoType.isAfter(rule.time); 

但是,这导致我另一个问题 – 超出最大调用堆栈大小( 堆栈溢出 ed; p)。

  1. 此外,当我不格式化date格式(在调用isAfter方法之前),它工作正常。 虽然我有一个rule.timevariables的虚拟值。 而且,我必须保持这两个date的格式相同。

所以,基于观察,我build议你不要在比较之前将date部分从date格式化,因为我认为这是必需的。

moment()。isAfter()以及moment()。isBefore()方法将以下面的格式进行input。

  YYYY-MM-DD Or YYYY-MM-DD hh:mm:ss 

在你的情况下,它在hh:mm:ss格式,因为它每次都返回false。 如果你想使用这个方法,那么改变你的规则数组,如下所示

 var rules = [ { time : "2016-10-03 12:00:00 pm", time1 : "2016-10-03 01:00:00 pm", value:0 }, { time : "2016-10-03 01:00:00 pm", time1 : "2016-10-03 02:00:00 pm", value:0 } ] 

并按如下格式设置data.start_time

  var d = moment(data.start_time).format("YYYY-MM-DD hh:mm:ss a"); 

这会给你所需的结果。