Moment: Как сравнить только ЧЧ:мм?

Созданный на 20 окт. 2013  ·  10Комментарии  ·  Источник: moment/moment

Я использую moment.js с моим проектом node.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;
}

Я хочу сравнивать только время в формате ЧЧ:мм. Однако это не работает, потому что

'7:00' > '2:00'

возвращает ложь. Любые идеи, как сравнить ЧЧ: мм?

Самый полезный комментарий

После просмотра других вопросов MomentJS я все еще не понимаю, как можно использовать момент, чтобы просто сравнить два разных времени .

Мне нужно (хочу), чтобы день/дата игнорировались.

Вариант использования:
Я читаю расписание с временем начала и окончания из файла конфигурации. Это делается с помощью Node.js

Время начала = 18: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

Мой сценарий технически рассчитан на два дня, и я понимаю, почему он неверен.

Мне нужен (ожидаемый) момент, чтобы вернуть TRUE, т.е. что currentTime isBeteen startTime и endTime и попадает в этот диапазон.

Я думал, что решил эту проблему, проверив, является ли час endTime> 12, а затем добавил день, чтобы момент понял, что это следующий день. например

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

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

Но если currentTime также после полуночи, то он ломается, например

01:30 не будет учитываться между 18:30 и 03: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

Кажется очевидным, что они будут ложными, поскольку _день/дата_ считается моментом. Это то, что я пытаюсь обойти.

Следующее будет работать:

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

Однако это будет означать, что мне нужно будет проверить, было ли ВРЕМЯ НАЧАЛА до 12:00 и ВРЕМЯ ОКОНЧАНИЯ после 12:00, а затем добавить 1 день к ВРЕМЕНИ ЗАВЕРШЕНИЯ.

Все 10 Комментарий

Обычно, если вас не волнует дата окончания времени, лучше просто явно отслеживать часы и минуты, но, конечно, я ничего не знаю о вашем приложении. Итак, чтобы ответить на него напрямую, определите новую функцию для возврата количества минут:

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

а затем проверьте, что:

return minutesOfDay(now) > minutesOfDay(end);

Кроме того, moment() делает то же самое, что и moment(new Date()) , так что это должно сэкономить вам немного текста.

После просмотра других вопросов MomentJS я все еще не понимаю, как можно использовать момент, чтобы просто сравнить два разных времени .

Мне нужно (хочу), чтобы день/дата игнорировались.

Вариант использования:
Я читаю расписание с временем начала и окончания из файла конфигурации. Это делается с помощью Node.js

Время начала = 18: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

Мой сценарий технически рассчитан на два дня, и я понимаю, почему он неверен.

Мне нужен (ожидаемый) момент, чтобы вернуть TRUE, т.е. что currentTime isBeteen startTime и endTime и попадает в этот диапазон.

Я думал, что решил эту проблему, проверив, является ли час endTime> 12, а затем добавил день, чтобы момент понял, что это следующий день. например

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

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

Но если currentTime также после полуночи, то он ломается, например

01:30 не будет учитываться между 18:30 и 03: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

Кажется очевидным, что они будут ложными, поскольку _день/дата_ считается моментом. Это то, что я пытаюсь обойти.

Следующее будет работать:

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

Однако это будет означать, что мне нужно будет проверить, было ли ВРЕМЯ НАЧАЛА до 12:00 и ВРЕМЯ ОКОНЧАНИЯ после 12:00, а затем добавить 1 день к ВРЕМЕНИ ЗАВЕРШЕНИЯ.

Наверное, я не совсем понимаю, что вы имеете в виду под «игнорированием дня». Если вы сравниваете эти два раза

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

каким-то образом система должна знать, что вы имеете в виду 3:30 _завтра_. Я имею в виду, как это вообще могло работать? Конечно, вы не думаете, что при отсутствии информации о дне, что 3:30 утра наступает после 18:00... Проблема в том, что у вас есть какой-то дополнительный контекст, которого нет у Момента, а именно то, что endTime Ожидается, что startTime ; это очевидно из ваших имен переменных, но Moment этого не знает и не может знать. Вы должны будете сказать это.

Так как насчет этого:

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

Да, я понимаю путаницу. Не зная, что мы имеем в виду «3:30 утра» на следующий день, это сложно.

Без учета дня/даты:
_Если я спрошу «11 вечера между 9 вечера и 3 часа ночи», я ожидаю, что ответ будет верным .
Если я спрошу «11 вечера между 3 и 9 часами вечера», я ожидаю, что ответ будет неверным ._

Поскольку я не могу просто игнорировать дату, используя момент, я начал проверять ВСЕ времена до/после 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 рейтинги