在查看了其他一些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。组装机?
答案 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” ,只是为了获得时间和时间...
工作正常!