2016-11-15 18 views
1

SO У меня есть 2 объекта datetime.Разница во времени между 2 моментами времени и времени

now = Nov 15 4:00 PM 
later = Nov 15 6:00PM 

Моя цель - получить общее количество часов между (9 утра до 5 вечера), учитывая теперь и позже.

итоговый ответ shud be 1 час. (поскольку им относится только к временному диапазону, который находится в пределах 9 AM-5PM)

now = Nov 15 6:00 AM 
later = Nov 15 8:00 PM 

Итоговый ответ должен составлять 8 часов.

- это лучший способ достичь этого, используя функцию дифференциала в момент и зачистить время и вычислить индивидуальные варианты использования (когда время начала менее 9 AM/время начала больше, чем 9AM). аналогично время окончания (менее 5 PM/более 5PM) и т. д.?

Кроме того, как решать этот случай, когда,

now = Nov 15 9:00AM 
later = Nov 18 2:00PM 

полученный ответ Шуд быть,

8 (15 ноября) +8 (ноябрь 16) +8 (17 ноября) +5 (18 ноября) = 29hrs

ответ

1

Вот рабочий раствор

var now = moment("15 Nov 2016, 9:00:00 am", "DD MMM yyyy, h:mm:ss a").toDate(); 
 
var later = moment("18 Nov 2016, 2:00:00 pm", "DD MMM yyyy, h:mm:ss a").toDate(); 
 

 
function getWorkingHours(now, later) { 
 
\t var hoursToday = 0; 
 

 
\t var workingHourStart = 9; 
 
\t var workingHourEnd = 17;//5pm 
 
\t var workDuration = workingHourEnd - workingHourStart; 
 
\t 
 
\t if(workingHourEnd - getHours(now) > 0) { 
 
\t \t hoursToday = (workingHourEnd - getHours(now)); 
 
\t \t hoursToday = (hoursToday > workDuration) ? workDuration : hoursToday; 
 
\t } 
 

 
\t var hoursLater = 0; 
 

 
\t if(getHours(later) - workingHourStart > 0) { 
 
\t \t hoursLater = (getHours(later) - workingHourStart); 
 
\t \t hoursLater = (hoursLater > workDuration) ? workDuration : hoursLater; 
 
\t } 
 

 
\t var actualDiffHours = (later.getTime() - now.getTime())/(1000 * 60 * 60); 
 
\t var actualHoursInBetween = actualDiffHours - (24 - getHours(now)) - getHours(later); 
 

 
\t var workingHoursInBetween = (actualHoursInBetween/24) * 8; 
 
\t 
 
\t return hoursToday + workingHoursInBetween + hoursLater; 
 
} 
 

 
function getHours(date) { 
 
\t var hours = date.getHours() + date.getMinutes()/60 + date.getSeconds()/3600 + date.getMilliseconds()/3600/1000; 
 
\t return hours; 
 
} 
 

 
console.log(getWorkingHours(now, later));
<script src="http://momentjs.com/downloads/moment.min.js"></script>

0

Сложно ... Функция getActiveHours вычисляет все активные слоты между датами начала и окончания, включительно, а затем удаляет отсутствующие часы в начале даты начала и в конце даты окончания.

var getDateObject = function (date) { 
    if (date && date.constructor.name == "Array") { 
    while (date.length < 7) {date.push(0);} 
    date = new Date(date[0], date[1], date[2], date[3], date[4], date[5], date[6]); 
    } else if (typeof date == 'string' || typeof date == 'number') { 
    date = new Date(date); 
    } 
    return date; 
}; 

var trimDate = function (date, period) { 
    var periods = ['second', 'minute', 'hour', 'day']; 
    period = periods.indexOf(period); 
    if (typeof date != 'number') {date = getDateObject(date).getTime();} 
    date = Math.floor(date/1000); 
    if (period > 0) {date = Math.floor(date/60);} 
    if (period > 1) {date = Math.floor(date/60);} 
    if (period > 2) {date = Math.floor(date/24);} 
    return new Date(date*24*60*60*1000); 
}; 

var getOffset = function (date) {return getDateObject(date).getTimezoneOffset()*60*1000;}; 

var addOffset = function (date) { 
    date = getDateObject(date); 
    return new Date(date.getTime()+getOffset(date)); 
}; 

var getActiveHours = function (iniDateTime, endDateTime, startHour, finishHour) { 
    var hourMs = 60*60*1000; // Define daily active hours 0-24 (decimal 17.5 = 5:30pm): 
    if (startHour == null) {startHour = 9;} 
    if (finishHour == null) {finishHour = 17;} 
    startHour *= hourMs; finishHour *= hourMs; 
    iniDateTime = getDateObject(iniDateTime).getTime(); 
    endDateTime = getDateObject(endDateTime).getTime(); 
    var iniDayTime = addOffset(trimDate(iniDateTime, 'day')).getTime(); 
    var endDayTime = addOffset(trimDate(endDateTime, 'day')).getTime(); 
    var totalHoursMs = (endDayTime-iniDayTime+24*hourMs)*(finishHour-startHour)/hourMs/24; 
    var iniHoursNotInMs = iniDateTime-iniDayTime-startHour; 
    var endHoursNotInMs = endDayTime+finishHour-endDateTime; 
    return (totalHoursMs-iniHoursNotInMs-endHoursNotInMs)/hourMs; 
}; 

console.log(Math.round(getActiveHours('2016-09-13 11:45:38', '2016-09-15 15:30:25'))); // 20 // Use Math round or floor 
1

Это должно сделать работу:

const now = moment(new Date(2016, 11, 15, 9, 0, 0)); 
 
const then = moment(new Date(2016, 11, 18, 14, 0, 0)); 
 

 
function calDiff(now, then) { 
 
    if (now.hour() < 9) { 
 
    now.hour(9); 
 
    } 
 

 
    if (then.hour() > 17) { 
 
    then.hour(17); 
 
    } 
 

 
    const total = then.diff(now, 'hours'); 
 

 
    const day = Math.floor(total/24); 
 
    
 
    return total - (16 * day); 
 
} 
 

 
console.log(calDiff(now, then));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.16.0/moment.min.js"></script>

0

я начал писать это некоторое время назад, когда я впервые увидел этот вопрос, но попал. Мой ответ очень похож на Кханга, но мы немного поменяли его.

Основная идея кода заключается в том, что он принимает два моментальных объекта. Если начальные часы меньше девяти, мы устанавливаем их в девять, и если конечные часы превышают 17 (5 часов), мы устанавливаем их равными 17.

Далее мы получаем разницу между двумя объектами в днях , За каждый день мы знаем, что есть 8 часов, на которые человек может получить кредит. Затем я переношу дату начала дня в день окончания и беру часы между ними.

Идея заключается в том, что если оба раза в одни и те же дни, разница будет в 0 дней. Если это 1, то мы получим в общей сложности 8 часов независимо от того, где мы начинаем в тот же день. единственные случаи я не испытанные вещи, где время начала больше времени окончания (я буду тестировать его как можно скорее и сделать правку, если есть что-то мне нужно изменить)

Редактировать

была действительно проблема, если время начала было после окончания (часы). Это было исправлено добавлением в один оператор if.

$(function() { 
 
    function getActiveHours(start, end) { 
 
    if (start.hours() < 9) start.hours(9); 
 
    if (end.hours() > 17) end.hours(17); 
 
    //These two if's should remove most of the issues when we are doing basic work 
 
    var days = end.diff(start, 'days'); 
 
    if (days == 0 && (end.date() - start.date()) == 1) days = 1; 
 
    var hours = (days * 8); //gets the hours 
 
    start.date(end.date()); 
 
    var diff = end.diff(start, 'hours'); 
 
    return hours + diff; 
 
    } 
 
    var start = moment([2016, 10, 15, 9, 0, 0]); 
 
    var end = moment([2016, 10, 18, 14, 0, 0]); 
 

 
    $('#results').html('Total hours worked from ' + start.format('MM-DD-YYYY @ hh:mm:ss') + ' to ' + end.format('MM-DD-YYYY @ hh:mm:ss') + ' is ' + getActiveHours(start, end)) 
 

 
});
<div id="results"></div>