Я использую 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'
возвращает ложь. Любые идеи, как сравнить ЧЧ: мм?
Обычно, если вас не волнует дата окончания времени, лучше просто явно отслеживать часы и минуты, но, конечно, я ничего не знаю о вашем приложении. Итак, чтобы ответить на него напрямую, определите новую функцию для возврата количества минут:
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/
Роб
Самый полезный комментарий
После просмотра других вопросов MomentJS я все еще не понимаю, как можно использовать момент, чтобы просто сравнить два разных времени .
Мне нужно (хочу), чтобы день/дата игнорировались.
Вариант использования:
Я читаю расписание с временем начала и окончания из файла конфигурации. Это делается с помощью Node.js
Мой сценарий технически рассчитан на два дня, и я понимаю, почему он неверен.
Мне нужен (ожидаемый) момент, чтобы вернуть TRUE, т.е. что currentTime isBeteen startTime и endTime и попадает в этот диапазон.
Я думал, что решил эту проблему, проверив, является ли час endTime> 12, а затем добавил день, чтобы момент понял, что это следующий день. например
Но если currentTime также после полуночи, то он ломается, например
01:30 не будет учитываться между 18:30 и 03:30 - также из-за разных дней
Любые другие предложения по выполнению этого и просто игнорированию дня/даты?
Мне трудно поверить, что это такой комплекс, но, возможно, это так:
Вот еще одно уточнение, что проблема возникает с охватом дней, даже если попытаться быть более явным:
Кажется очевидным, что они будут ложными, поскольку _день/дата_ считается моментом. Это то, что я пытаюсь обойти.
Следующее будет работать:
Однако это будет означать, что мне нужно будет проверить, было ли ВРЕМЯ НАЧАЛА до 12:00 и ВРЕМЯ ОКОНЧАНИЯ после 12:00, а затем добавить 1 день к ВРЕМЕНИ ЗАВЕРШЕНИЯ.