2016-01-29 1 views
0

Итак, есть много примеров того, как рассчитать время между двумя датами.javascript: оцените, если заданный час находится между двумя часами

Но в моем случае у меня есть дата X. Скажем, это сегодня. Х имеет ассоциированное с ним время, например. 8:00 (Или, что я вернусь из .getHours())

мне нужно знать, если часы X находятся между стартовым часа (скажем, «07:00») и конец час (скажем, «12:00 «)

X всегда будет извлекаться с помощью getHours() начало и конец час диапазона имеют фиксированный формат (например,„7:00“и„12:00“)

Производительность является проблемой, так то, что лучше работает, предпочтительнее (например, если это подразумевает использование moment, это нормально, но если пользовательская функция будет работать лучше, мы хотим это)

Мой первый подход был бы, по мере того, как форматы фиксированы, преобразовать .getHours() в число, а также для диапазона часов, а затем рассчитать ... Я чувствую этот подход, у меня возникают проблемы с некоторыми особыми случаями, которые я не могу понимаете?

+2

', если (X> = 7 и X <= 12) {/ * делать то, что * /}' – Robbert

+0

@Robbert это звучит как, возможно, самый простой, что нужно сделать ... . Вы shoulod обеспечивают это как ответ. Мне нужно будет сделать некоторые тесты, также мне нужно получить подтверждение, если часы полные часы или если может быть как полчаса и тому подобное ... – faboolous

+1

@ faboolous - вы всегда можете преобразовать значения в минуты. Но диапазон никогда не перейдет в полночь? – RobG

ответ

0

Имея отношение к военной тактике? (От 0:00 до 24:00)

getHours() возвращает целое число, и если вас интересуют только часы, а не минуты, вы можете использовать parseInt(), чтобы включить начало и конец часов в целые числа. Например, parseInt('07:00', 10) вернет 7. Так что если вы хотите создать функцию, чтобы проверить, если текущее время находится между двумя часами, это может выглядеть примерно так:

function isBetweenHours(startHour, endHour) 
{ 
    var now = new Date().getHours(); 
    return now >= parseInt(startHour, 10) && now <= parseInt(endHour, 10); 
} 

Тогда вы бы использовать его как это:

if(isBetweenHours('07:00', '12:00')) { //some code here } 
+0

Не военное время, но европейское время. В Европе люди привыкли форматировать галстук таким образом. Это выглядит круто, возможно, на что я нацелен. Я сделаю некоторые тесты. – faboolous

+0

Нет необходимости в parseInt, значения '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', поскольку * now * является числом. – RobG

+0

@RobG Когда я запускаю '11> '10: 00'' в консоли JS, он возвращает false. –

1

Вы могли бы использовать moment-range

из документации:

Вы также можете создать диапазон от ISO 8601 временного интервала й кольцо:

var timeInterval = "2015-01-17T09:50:04+00:00/2015-04-17T08:29:55+00:00"; 
var range = moment.range(timeInterval); 
range.contains(X); // true if between interval 
+0

Поскольку OP обеспокоен производительностью, я ожидаю, что это будет намного медленнее, чем альтернативы, такие как Брайан. – RobG

+0

@RobG true, мы должны сделать несколько тестов. Просматривая [исходный код] (https://github.com/gf3/moment-range/blob/master/lib/moment-range.js#L84), это не похоже на неэффективное решение. –

1

Если вы хотите, чтобы проверить часть часов, рассмотрим преобразование часов до нескольких минут, что-то вроде следующего. Как вы справитесь с диапазонами, которые пройдут в полночь? например 23:30 до 01:30.

/* Determine if the current time is between two provided hours 
 
** @param {string} h0 - time in format h:mm 
 
** @param {string} h1 - time in format h:mm 
 
** @returns {boolean} true if the current time is between or equal to h0 and h1 
 
*/ 
 
function betweenHours(h0, h1) { 
 
    var now = new Date(); 
 
    var mins = now.getHours()*60 + now.getMinutes(); 
 
    return toMins(h0) <= mins && mins <= toMins(h1); 
 
} 
 

 
/* Convert hours to minutes 
 
** @param {string} h - time in format h:mm 
 
** @returns {number} time converted to minutes 
 
*/ 
 
function toMins(h) { 
 
    var b = h.split(':') 
 
    return b[0]*60 + +b[1]; 
 
} 
 

 
<form> 
 
    Start time (h:mm)<input name="startHours"> 
 
    <br> 
 
    End time (h:mm)<input name="endHours"> 
 
    <br> 
 
    <button type="button" onclick=" 
 
    this.form.inRange.value = betweenHours(this.form.startHours.value, this.form.endHours.value); 
 
    ">Check range</button> 
 
    <br> 
 
    Currently in range? <input name="inRange" readonly> 
 
</form> 
 
      

+0

Для диапазонов, которые выходят за полночь, мы инвертируем чек. Речь идет о вычислении рабочих сдвигов, поэтому диапазоны - это время сдвига (начало - конец). Таким образом, нам нужно знать, находится ли данный час между началом и концом сдвига, и мы перебираем все заданные диапазоны сдвига. Перемены происходят в одночасье, для тех, для каждой итерации, мы думали проверить, начинается ли начало диапазона между началом перехода и его концом! Я думаю, что ваше решение полностью соответствует нашим потребностям, уже одобренным, теперь реализующим и, возможно, принимающим :) – faboolous

+0

Поскольку вы имеете дело с границами дат, было бы более надежно использовать datetimes и проверять, находится ли время datetime в пределах диапазона. – pmont

+0

@ pmont - возможно, но такие вещи, как смены в реестре, обычно просто указываются с начальным и конечным временем, например. 00:00 - 00:06. Только определенные сдвиги имеют связанную дату. – RobG

Смежные вопросы