Moment: HH:mmのみを比較する方法は?

作成日 2013年10月20日  ·  10コメント  ·  ソース: moment/moment

node.jsプロジェクトでmoment.jsを使用しています

isWithinTime: function(end) {

     var moment = require('moment');
     var now = moment(new Date()).format('HH:mm');
     var end = moment(new Date(end)).format('HH:mm');

     if (now.toString() > end.toString()) {
         return false;
     }
     return true;
}

HH:mm形式の時間のみを比較したい。 ただし、それは機能しません。

'7:00' > '2:00'

falseを返します。 HH:mmを比較する方法はありますか?

最も参考になるコメント

他のMomentJSの質問を調べた後、 2つの異なる時間を単純に比較するためにモーメントをどのように使用するかについてはまだ困惑しています。

曜日/日付を無視する必要があります(したい)。

使用事例:
設定ファイルから開始時刻と終了時刻のあるスケジュールを読んでいます。 これはNode.jsを使用して行われます

開始時間=午後6時30分
終了時間=午前3時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 = currentTime.isBetween(startTime , endTime);
console.log(amIBetween);   //  returns false.  if date ignored I expect TRUE

私のシナリオは技術的には2日間に及び、なぜそれが間違っているのか理解しています。

TRUEを返すには(期待する)瞬間が必要です。つまり、currentTimeはbeteen startTimeとendTimeであり、その範囲内にあります。

endTime時間が12を超えているかどうかを確認し、1日を追加して、次の日であることを瞬間に理解させることで、解決したと思いました。 例えば

if (startTime.hour() >=12 && endTime.hour() <=12 )
    {
        endTime.add(1, "days");       // handle spanning days
    }

    var isBetween = currentTime.isBetween(startTime, endTime);   // TRUE

しかし、currentTimeも真夜中過ぎの場合は壊れます-例:

午前1時30分は午後6時30分から午前3時30分までは考慮されません-これも日が異なるためです

これを達成し、単に曜日/日付を無視するための他の提案はありますか?

これが複雑だとは信じがたいですが、多分そうです:

より明確にしようとしても、問題は日数にまたがって発生することをさらに明確にします。

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

_day / date_は瞬間的に考慮されるので、それらがfalseになることは明らかなようです。 これは私が回避しようとしていることです。

以下が機能します。

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

ただし、これは、開始時刻が午前12時より前であるかどうか、および終了時刻が午前12時以降であるかどうかを確認してから、終了時刻に1日を追加する必要があることを意味します。

全てのコメント10件

通常、終了時刻を気にしない場合は、時間と分を明示的に追跡することをお勧めしますが、もちろん、私はあなたのアプリについて何も知りません。 したがって、直接答えるには、分数を返すための新しい関数を定義します。

var minutesOfDay = function(m){
  return m.minutes() + m.hours() * 60;
}

次に、次のことを確認します。

return minutesOfDay(now) > minutesOfDay(end);

余談ですが、 moment()moment(new Date())と同じことをするので、テキストを節約できます。

他のMomentJSの質問を調べた後、 2つの異なる時間を単純に比較するためにモーメントをどのように使用するかについてはまだ困惑しています。

曜日/日付を無視する必要があります(したい)。

使用事例:
設定ファイルから開始時刻と終了時刻のあるスケジュールを読んでいます。 これはNode.jsを使用して行われます

開始時間=午後6時30分
終了時間=午前3時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 = currentTime.isBetween(startTime , endTime);
console.log(amIBetween);   //  returns false.  if date ignored I expect TRUE

私のシナリオは技術的には2日間に及び、なぜそれが間違っているのか理解しています。

TRUEを返すには(期待する)瞬間が必要です。つまり、currentTimeはbeteen startTimeとendTimeであり、その範囲内にあります。

endTime時間が12を超えているかどうかを確認し、1日を追加して、次の日であることを瞬間に理解させることで、解決したと思いました。 例えば

if (startTime.hour() >=12 && endTime.hour() <=12 )
    {
        endTime.add(1, "days");       // handle spanning days
    }

    var isBetween = currentTime.isBetween(startTime, endTime);   // TRUE

しかし、currentTimeも真夜中過ぎの場合は壊れます-例:

午前1時30分は午後6時30分から午前3時30分までは考慮されません-これも日が異なるためです

これを達成し、単に曜日/日付を無視するための他の提案はありますか?

これが複雑だとは信じがたいですが、多分そうです:

より明確にしようとしても、問題は日数にまたがって発生することをさらに明確にします。

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

_day / date_は瞬間的に考慮されるので、それらがfalseになることは明らかなようです。 これは私が回避しようとしていることです。

以下が機能します。

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

ただし、これは、開始時刻が午前12時より前であるかどうか、および終了時刻が午前12時以降であるかどうかを確認してから、終了時刻に1日を追加する必要があることを意味します。

「その日を無視する」とはどういう意味かよくわかりません。 これらを2回比較している場合

var startTime = moment('06:00p', "HH:mm a");
var endTime = moment('03:30a', "HH:mm a");

どういうわけか、システムはあなたが3:30_tomorrow_を意味していることを認識しなければなりません。 つまり、どうやってそれが機能するのでしょうか? 確かに、午前3時30分が午後6時以降であるという日の情報がない場合、問題は、モーメントにはない追加のコンテキストがあることです。つまり、 endTimestartTimeの後にあると予想されます; これは変数名から明らかですが、Momentはそれを認識しておらず、知ることもできません。 あなたはそれを言わなければならないでしょう。

では、これはどうですか?

if (startTime.isAfter(endTime)){
  endTime.add(1, 'days');
}

ええ、私は混乱を理解しています。 「午前3時30分」が翌日のことを意味することを知らずに、それはトリッキーです。

日/日付を無視する:
_「午後9時から午前3時の間は午後11時です」と尋ねると、答えは正しいと思います
「午前3時から午後9時の間は午後11時です」と尋ねると、答えは間違っていると思います。

日付を使用して日付を単純に無視することはできないので、12の前後のすべての時間をチェックし始め、最終的に次のようになりました。

if ( (startTime.hour() >=12 && endTime.hour() <=12 ) || endTime.isBefore(startTime) )
    {
        endTime.add(1, "days");       // handle spanning days endTime

        if (currentTime.hour() <=12 )
        {
            currentTime.add(1, "days");       // handle spanning days currentTime
        }
    }

ここにあるフィドルは、私のユースケースシナリオを示しています。 お役に立てば幸いです。
https://jsfiddle.net/rfossella/66wjtnvk/1/

お時間をいただき、ありがとうございました(しゃれは意図されていません:-))

または、この関数のようなもの:

@Machibuseの回答後に更新

function getTime(dateTime: Moment): Moment {
    return moment({h: dateTime.hours(), m: dateTime.minutes()});
}

/** USAGE EXAMPLE */
const first: Moment = getTime( moment([2018, 5, 1, 17, 0, 0]) ); // 17:00
const second: Moment = getTime( moment([2013, 8, 2, 18, 0, 0]) );  // 18:00
const third: Moment = getTime( moment([2015, 3, 3, 19, 0, 0]) );  // 19:00

second.isAfter(first, 'minutes'); // true
first.isBefore(second, 'minutes'); // true
first.isAfter(second, 'minutes'); // false
second.isBefore(first, 'minutes'); // false

second.isBetween(first, third, 'minutes', '[]'); // true 
third.isBetween(first, second, 'minutes', '[]'); // false

// second.diff(first, 'minutes') => 60
// second.diff(third, 'minutes') => -60
// third.diff(first, 'minutes') => 120

したがって、MomentJSメソッドisBetween, isAfter, isBeforeは、日付ではなく時間のみである可能性があります。

試す

second.isBetween(third, first, 'minutes', '[]'); // true

これはMomentのバグではなく、最初のパラメーターがより早い日付でなければならないというドキュメントの欠落している情報です。

これもかなり困惑しています。 私はそれを認めるよりも多くを費やしました! @Machibuseまたは@rfossellaどの実装が機能することになったのですか?

私は以前同じ問題に悩まされていましたが、最終的にそれを機能させる方法を見つけました👍軍隊の時間で時間をフォーマットします、それが役立つことを願っています...

const isTimeBetween = function(startTime, endTime, serverTime) {
    let start = moment(startTime, "H:mm")
    let end = moment(endTime, "H:mm")
    let server = moment(serverTime, "H:mm")
    if (end < start) {
        return server >= start && server<= moment('23:59:59', "h:mm:ss") || server>= moment('0:00:00', "h:mm:ss") && server < end;
    }
    return server>= start && server< end
}

次に、この関数を次のように使用できます。

isTimeBetween('22:30', '3:00', '23:50') //return true
isTimeBetween('22:30', '3:00', '1:50') //return true
isTimeBetween('22:30', '3:00', '4:50') //return false

@kdavongとてもうまくいきました、ありがとう!

やあ、
何年も前に投稿したフィドルを再確認しましたが、まだアクティブであり、機能しています。 参考までに:私の例では、必要な場合に備えて、軍事時間を紹介していません。

ここにあるフィドルは、私のユースケースシナリオを示しています。 お役に立てば幸いです。
https://jsfiddle.net/rfossella/66wjtnvk/1/

ロブ

このページは役に立ちましたか?
0 / 5 - 0 評価