2010-01-09 2 views
1

У меня возникли проблемы с вычислением разницы времени (часов: минут) между тремя значениями времени, представленными как строки ЧЧ: мм.Вычисление разницы во времени с тремя значениями времени

Я рассчитываю, что время работало в течение дня, времени, времени и времени.

например. вар time_worked = time_out - обед - time_in или 07:00 = 17:00 - 01:00 - 09:00

Я знаком с датами PHP но JavaScript Object дата страшно!

Код:

var time_in = $(".time-in").val(); // 09:00 
var time_out = $(".time-out").val(); // 17:00 
var lunch = $(".lunch").val(); // 01:00 

var time = time_out - lunch - time_in; // should be 07:00 or 7 
+0

Я не вижу здесь вопроса –

+0

, пожалуйста, дайте нам некоторый контекстный код. – Hogan

ответ

2

Я думаю, что вы misconceptualizing вашей проблемной области.

В частности, если вы пытаетесь найти timeAtWork, и все будет представлено как объект времени (например, в секундах с эпохи), вам нужно знать четыре важных момента (три перечисленные вами [startWork, endWork и startLunch], и тот, который вы пропустили, [endLunch]).В этом случае, вы можете рассчитать нужное значение с помощью следующих вычитаний, при условии, что на каком бы языке вы работаете в опорам добавления/удаления даты (для JavaScript, обратите внимание на отличную date.js библиотеку)

timeAtWork = (endWork-endLunch) + (startLunch-startWork)

или equivelantly

timeAtWork = (endWork - startWork) - (endLunch - startLunch)

Однако, это звучит для меня как у вас есть две переменные 'время' [StartWork и EndWork] и один 'TimeSpan' переменная [lunchDuration]. В этом случае lunchDuration составляет примерно 3600 (один час), но не представляет собой истинную комбинацию даты и времени.

В этом случае lunchDuration === (endLunch - startLunch), так что вы можете вычислить timeAtWork следующим образом:

timeAtWork = (endWork - startWork) - lunchDuration

Надеется, что это помогает!

5

Я предлагаю думать об этом немного по-другому ... учитывая ваш три раза, конвертировать все времена в чистые часы, а затем сделать математику, как вы бы в часах. Если вам нужно, вы можете превратить дробные часы в минуты.

Любое время можно превратить в часы, просто разделив количество минут на 60 и добавив результат в часовую часть. Ваша математика тогда становится очень легкой, это то же самое выражение, которое у вас есть, кроме того, что вам не нужно заниматься математикой, основанной на времени.

Если вы дали вход что-то вида «чч: мм», где чч и мм целые числа, то вы можете вычислить чистые часы используя следующее выражение:

var mytime = "hh:mm"; 
var temp = mytime.split(":"); 
var hours = temp[0] + (temp[1]/60); 

редактировать: Другие отмечают проблемы, возникающие, если вы занимаетесь ночной сменой. Простое решение (не требующее создания объектов Date) заключается в добавлении 24 часов к времени начала, когда время окончания меньше времени начала (и это, конечно, может быть сделано в домене «чистые часы»).

+0

Спасибо, у меня наверняка были мои моргания в последние несколько часов! Это имеет больший смысл. – th3hamburgler

2

Мне не хватает эксперта по JavaScript, который поможет вам в этом, но поскольку вы, кажется, используете времена, связанные с повторением, если ваше место работает 24 часа, обратите особое внимание на любую смену, которая пересекает полночь. 7:00 четверг - 23:00 среда = 8.

+0

хорошая точка. Если времена представлены объектами Date, то, вероятно, лучше всего конвертировать все в эпоху и делать вычисления. – Anurag

+0

да, ни один из полей времени не связан напрямую с датой, поэтому преобразование их в даты объектов вызовет проблемы. Для этого приложения лучшим вариантом будет преобразование значений строк в десятичные часы. – th3hamburgler

+0

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

2

Используйте функцию getTime(), которая возвращает количество миллисекунд, прошедших с 1 января 1970 года Так что ваш код будет выглядеть следующим образом:

var time_worked_ms = time_out.getTime() - lunch.getTime() - time_in.getTime(); 

time_worked_ms будет содержать количество миллисекунд за ваш интервал.

0

Учитывая 2 «HH: мм» строка, следующий метод возвратит флоит количество времени между ними:

function timeDiff(time1, time2) { 
    var time1array = time1.split(":"); 
    var time2array = time2.split(":"); 
    var hour1 = parseInt(time1array[0]); 
    var min1 = parseInt(time1array[1]); 
    var hour2 = parseInt(time2array[0]); 
    var min2 = parseInt(time2array[1]); 
    return (hour1 + min1/60) - (hour2 + min2/60); 
} 
Смежные вопросы