2016-10-28 2 views
0

Nachdem ich einige der anderen MomentJS-Fragen und Antworten durchgelesen habe, bin ich immer noch ratlos, wie man den Moment verwenden würde, um zwei verschiedene Male zu vergleichen.Nur TIME-Werte vergleichen MomentJS

Ich brauche (will) nicht den Tag/das Datum zu berücksichtigen.

Mein Anwendungsfall ist dies: Ich lese einen Zeitplan (Start/Ende mal) aus einer Konfigurationsdatei. Dies geschieht mit Hilfe Node.js getan

Starttime = 06.30
Endtime = 03.30

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 

Mein Szenario ist technisch Spanning zwei Tage und ich verstehe, warum es falsch ist.

Ich brauche (erwarten) Moment, um TRUE zurückzugeben - d. H. Dass currtime istBeteen Start und Endzeit und fällt in diesen Bereich.

Müsste ich nach 12 Uhr nachsehen und dann einen Tag hinzufügen, damit der Scheck funktioniert? Andere Vorschläge, um dies zu erreichen. Ich schaute auf Moment-Bereich, der Funktion enthält, aber mit ähnlicher Frage dafür.

Ich finde es schwer zu glauben, dass es dieser Komplex ist, aber vielleicht ist es: \

-

Hier eine weitere Klarstellung ist das Problem mit Spanning Tagen entsteht, auch wenn sie versuchen, mehr explizit zu sein :

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 

scheint Art offensichtlich, dass sie seit der Tage/Datum falsch sein würde von Moment betrachtet wird. Das ist es, was ich versuche zu umgehen.

Die folgende funktionieren würde:

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

Dies aber würde bedeuten, dass ich zu überprüfen, bräuchten zu, wenn die Startzeit vor 00.00 Uhr war & & die ENDTIME wie nach 00.00 dann 1 Tag bis ENDTIME hinzuzufügen. Kluddel?

Antwort

0

Ich sehe zwei Probleme.

1) Ihre Variablennamen currtime auf 5 Linie als Ihre Erklärung ist anders auf der Linie 1 currentTime

2) Man könnte es in zwei Kontrollen um Mitternacht wie so brechen:

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

Ja, das war Tippfehler in der Zeit. Schätzen Sie den Vorschlag – rfossella

0

Antwort des dylpickle sieht für mich korrekt aus, aber wenn Sie sich entscheiden, dass das isBetween leicht zu fummeln ist, dann sollten Sie diese Abstraktion wegnehmen und einen Schritt tiefer in ihre Funktionalität gehen.

„Explizit ist viel billiger als die falsche Abstraktion“

Das ist nicht zu sagen, dass isBetween die falsche Abstraktion ist, aber es ist ein kleines bisschen weniger explizit, dass Sie leicht die Parameter füttern könnte in die falsche Antwort, die Ihnen das Gegenteil von dem geben würde, was Sie beabsichtigten.

Wenn Sie

console.log(currentTime.isBetween) 

erhalten Sie die Implementierung:

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

Beachten Sie, dass es verwendet nur isAfter() und isBefore(). Manchmal können Sie Dinge vereinfachen, indem Sie mit Ihrem Code expliziter werden.

isBetween sieht etwas egglifiziert aus und scheint alle Randfälle zu erfassen, aber haben Sie keine Angst zu versuchen, die Dinge zu verbessern.

Versuchen Sie, den folgenden Code:

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

console.log(isBetween) 

Es gibt keine Möglichkeit, später bei der Implementierung oder das Hinzufügen von Änderungen zu verwechseln. Dies erhöht die zyklomatische Komplexität oder die Codezeilen nicht.

0

Nach meinen eigenen Tests und dem Blick auf die Vorschläge anderer zeigte sich, dass die Nichtbeachtung von DAY/DATE und der Versuch, Tage zu überbrücken, ein Problem waren. Ich habe mir das ausgedacht, was jetzt in meiner App funktioniert.

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