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