只想比较MomentJS的TIME值

时间:2016-10-28 19:26:01

标签: javascript momentjs

在查看了其他一些MomentJS问题和答案后,我仍然难以理解如何使用时刻来简单地比较两个不同的时间

我不需要(想要)考虑的日期/日期。

我的用例是这样的:     我正在从配置文件中读取计划(开始/结束时间)。这是使用Node.js

完成的
  

开始时间=下午6:30
  结束时间= 3:30 AM

var currentTime= moment();    // e.g. 11:00 pm
var starttime = moment('06:30 pm', "HH:mm a");
var endtime = moment('03:30 am', "HH:mm a");

amIBetween = currtime.isBetween(starttime , endtime);
console.log(amIBetween);   //  returns false

我的情景在技术上跨越两天,我理解为什么它是错误的。

我需要(期待)时刻返回TRUE - 即那个时间是开始和结束时间并且在该范围内。

我需要在12点之后检查一段时间,然后再添加一天来检查工作吗? 任何其他建议来实现这一目标。我查看了具有“包含”功能的时刻范围,但有类似的问题。

我发现很难相信这是复杂的,但可能是:\

-

以下进一步说明问题出现在跨越日期,即使在尝试更明确时:

var currentTime= moment('11:00p', "HH:mm a");
var startTime = moment('06:00p', "HH:mm a");
var endTime = moment('03:30a', "HH:mm a");

currentTime.toString(); //"Fri Oct 28 2016 23:00:00 GMT-0400"
startTime.toString();   // "Fri Oct 28 2016 18:00:00 GMT-0400"
endTime.toString();    // "Fri Oct 28 2016 03:30:00 GMT-0400"

currentTime.isBetween(startTime, endTime);  // false
currentTime.isAfter(endTime) && currentTime.isBefore(startTime); //false
currentTime.isAfter(startTime) && currentTime.isBefore(endTime); //false

似乎很明显他们是假的,因为日/日期被考虑。这就是我想要解决的问题。

以下方法可行:

endTime.add(1, "days");
currentTime.isBetween(startTime, endTime);  // TRUE

然而,这意味着,我需要检查START TIME是否在12 AM之前&&在12点之后的ENDTIME然后将1天添加到ENDTIME。组装机?

4 个答案:

答案 0 :(得分:0)

我看到两个问题。

1)第5行的变量名currtime与第1行currentTime的声明不同

2)你可以在午夜左右将它分成两张支票,如下:

var currentTime = moment();    // e.g. 11:00 pm
var sixThirty = moment('06:30 pm', "HH:mm a");
var midnight = moment('12:00 am', "HH:mm a");
var threeThirty = moment('03:30 am', "HH:mm a");

amIBetween1 = currentTime.isBetween(sixThirty , midnight);
amIBetween2 = currentTime.isBetween(midnight , threeThirty);
console.log(amIBetween1);
console.log(amIBetween2);

答案 1 :(得分:0)

dylpickle的回答看起来对我来说是正确的,但是如果你认为isBetween很容易摸索,那么你可能想要把这个抽象带走,更进一步了解它的功能。

“显性比错误的抽象便宜得多”

这并不是说isBetween是错误的抽象,但它有点不那么明确,因为你可以很容易地将错误答案中的参数提供给你,这会给你与你想要的相反。

如果你

console.log(currentTime.isBetween)

你得到了实施:

ob(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}

请注意,它只使用 isAfter() isBefore()。 有时,您可以通过更明确地使用代码来简化操作。

isBetween看起来有点丑陋,似乎涵盖了所有边缘情况,但也不要害怕尝试改进。

请尝试以下代码:

const isBetween = currentTime.isAfter(endtime) && currentTime.isBefore(starttime);

console.log(isBetween)

无法在实施中混淆或稍后添加更改。这不会增加圈复杂度或代码行。

答案 2 :(得分:0)

在我自己进行测试并查看其他建议之后,似乎无视DAY / DATE并试图跨越几天是一个问题。我想出了这个,现在正在我的应用程序中工作。

isTimeBetween = function(aStartTime, anEndTime, aCurrTime)
{
    // you may pass in aCurrTime or use the *actual* current time
    var currentTime = !aCurrTime ? moment() : moment(aCurrTime, "HH:mm a");
    var startTime = moment(aStartTime, "HH:mm a");
    var endTime = moment(anEndTime, "HH:mm a");

    if (startTime.hour() >=12 && endTime.hour() <=12 )
    {
        endTime.add(1, "days");       // handle spanning days
    }

    var isBetween = currentTime.isBetween(startTime, endTime);

    /***  testing   
    startTimeString = startTime.toString();
    endTimeString = endTime.toString();
    currentTimeString = currentTime.toString();

    console.log(startTimeString);
    console.log(endTimeString);
    console.log(currentTimeString);
    console.log('\nis '+ currentTimeString  + ' between ' + 
              startTimeString + ' and ' + endTimeString + ' : ' 
              + isBetween);
    ****/
    return isBetween;
    }

isTimeBetween("06:30pm", "03:30am", "11:00pm");     //true      !! this is main use case
isTimeBetween("06:30pm", "10:30pm", "11:00pm");     //false
isTimeBetween("04:00am", "06:00am");                //true (e.g. current time is 5am

答案 3 :(得分:0)

我面临着同样的问题,我做了如下工作:

function fgEsHora1MayorAHora2(hora1, hora2) {

  var f1 = moment('2000-01-01 ' + hora1);
  f1.tz('America/Mexico_City').format('ha z');
  let f1Hora = f1.toObject().hours;
  let f1Minutos = f1.toObject().minutes;

  var f2 = moment('2000-01-01 ' + hora2);
  f2.tz('America/Mexico_City').format('ha z');
  let f2Hora = f2.toObject().hours;
  let f2Minutos = f2.toObject().minutes;

  let minutos1 = parseInt(f1Hora * 100) + parseInt(f1Minutos);
  let minutos2 = parseInt(f2Hora * 100) + parseInt(f2Minutos);

  return minutos1 > minutos2;
}

我将小时数分开,然后乘以100,以得到更多的价值...因此,我加上“小时数”加分钟数,然后进行了比较。.

备注:诀窍在于添加日期,例如“ 2001-01-01” ,只是为了获得时间和时间...

工作正常!