【问题标题】:comparing between sets of time using moment.Js使用 moment.Js 比较时间集
【发布时间】:2016-10-19 02:57:30
【问题描述】:

我已经定义了一套规则。

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

此外,如果有任何更快或更好的方法来进行此类比较,请您在下面留下要点。我也去看看。

【问题讨论】:

    标签: javascript node.js momentjs


    【解决方案1】:

    我尝试调试您的代码并进行了一些观察 -

    1. moment(d).isAfter - 在这里,moment(d) 没有名为“isAfter”的方法。这是一件奇怪的事情,因为它应该按照documentation 使用这种方法。我不得不像下面这样调用原型方法 -

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

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

    1. 另外,当我没有按照您正在格式化的方式(在调用 isAfter 方法之前)格式化日期时,它可以正常工作。虽然我对 rule.time 变量有一个虚拟值。此外,我必须保持两个日期的格式相同。

    因此,根据观察结果,我建议您不要在比较之前通过格式化日期来撕掉日期部分,因为我猜这是必需的。

    【讨论】:

    【解决方案2】:

    moment().isAfter()moment().isBefore() 方法将采用以下格式输入。

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

    这将为您提供所需的结果。

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      相关资源
      最近更新 更多