2016-10-28 5 views
0

他のMomentJSの質問と回答を見て、私はまだという2つの異なる時刻をと単純に比較するのに慣れていません。TIMEの値を比較したいだけです。MomentJS

私は日/日を考慮する必要はありません。

私の使用例は次のとおりです。 設定ファイルからスケジュール(開始時刻と終了時刻)を読んでいます。これは、Node.jsの

を使用して行われたstartTime = 18: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 

私のシナリオでは、技術的には2日間にわたるされると、それは偽だ、なぜ私は理解しています。

TRUEを返す瞬間が必要です。つまり、currtime isBeteen startとendtimeは、その範囲に収まります。

私は午前12時以降の時間をチェックし、チェックを行うために1日追加する必要がありますか? これを達成するための他の提案。私は機能を「含む」が似ている瞬間を見ました。

私はそれは難しい、それはこの複雑だと信じるように見つけるんだけど、多分それは次のとおりです。

\ -

ここではその問題がより明確になろうとした場合であっても、スパニング日に発生し、さらに明確化です:

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は、その後ENDTIMEに1日追加12AM後など12AM & &前ENDTIMEだった場合、私がチェックする必要があるだろうと、しかし意味します。クルージュ?

答えて

0

2つの問題があります。

1)ライン5上のあなたの変数名currtimeがライン上であなたの宣言と異なっている1 currentTime

2)あなたはそうのような真夜中の周りの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); 
+0

ええと、それはcurrtimeでタイプミスでした。提案を感謝する – rfossella

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) 

は、次のコードを試してみてください。これは循環的な複雑さやコード行を増加させません。

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 
関連する問題