Расчет разницы во времени с тремя значениями времени - PullRequest
1 голос
/ 09 января 2010

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

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

например, var time_worked = time_out - ланч - time_in или 07:00 = 17:00 - 01:00 - 09: 00

Я знаком с датами php, ноjavascript объект даты страшен!

код:

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  

Ответы [ 5 ]

5 голосов
/ 09 января 2010

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

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

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

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

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

2 голосов
/ 09 января 2010

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

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

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

или равноэквивалентно

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

Однако мне кажется, что у вас есть две переменные time [startWork и endWork] и одна переменная timespan [lunchDuration]. В этом случае lunchDuration похож на 3600 (один час), но не представляет собой истинную комбинацию даты и времени.

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

timeAtWork = (endWork - startWork) - lunchDuration

Надеюсь, это поможет!

2 голосов
/ 09 января 2010

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

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

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

2 голосов
/ 09 января 2010

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

0 голосов
/ 09 января 2010

Учитывая 2 строки "ЧЧ: мм", следующий метод вернет число с плавающей точкой времени между ними:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...