Javascript 只想比较时间值MomentJS

Javascript 只想比较时间值MomentJS,javascript,momentjs,Javascript,Momentjs,在浏览了MomentJS的其他一些问题和答案后,我仍然很困惑如何利用MomentJS简单地比较两个不同的时间 我不需要(希望)考虑日期 我的用例是: 我正在从配置文件中读取计划(开始/结束时间)。这是使用Node.js完成的 开始时间=下午6:30 结束时间=凌晨3:30 我的设想从技术上讲是跨越两天的,我理解为什么它是错误的 我需要(期望)时刻返回TRUE,即currtime介于开始时间和结束时间之间,并且在该范围内 我是否需要在上午12点后检查一段时间,然后再加上一天以使检查生效? 完成这一

在浏览了MomentJS的其他一些问题和答案后,我仍然很困惑如何利用MomentJS简单地比较两个不同的时间

我不需要(希望)考虑日期

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

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

我的设想从技术上讲是跨越两天的,我理解为什么它是错误的

我需要(期望)时刻返回TRUE,即currtime介于开始时间和结束时间之间,并且在该范围内

我是否需要在上午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
这意味着,我需要检查开始时间是否在上午12点之前,结束时间是否在上午12点之后,然后在结束时间上加1天。乱七八糟?

我看到两个问题

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

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)

在实现过程中,或者在以后添加更改时,没有办法感到困惑。这不会增加圈复杂度或代码行。

在我自己的测试和查看其他人的建议后,似乎忽略日期和试图跨越日期是一个问题。我想出了这个,现在正在我的应用程序中工作

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
istimetween=函数(aStartTime、anEndTime、aCurrTime)
{
//您可以传入aCurrTime或使用*实际*当前时间
var currentTime=!aCurrTime?矩():矩(aCurrTime,“HH:mm a”);
var startTime=力矩(aStartTime,“HH:mm a”);
var endTime=力矩(anEndTime,“HH:mm a”);

如果(startTime.hour()>=12&&endTime.hour()我也面临同样的问题,我做了如下解决方法:

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”,以便获得时间和小时


而且效果很好!!

是的,这是currtime的打字错误。感谢您的建议
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;
}