Получите разницу во времени между двумя датами, пропускающими нерабочие часы

Я пытаюсь найти разницу между двумя полями даты и времени, пропуская нерабочее время.

Этот вычисляет разницу между двумя полями даты и времени.

moment.utc(moment(data.ClosureDate).diff(moment(data.Created))).format("HH:mm:ss")

Этот работает нормально, но я не уверен, как вычесть нерабочие часы

Я хочу учитывать только 9:00-18:00 для каждого дня и вычислять разницу

Например, если date.Created — 19 февраля, 19:00, а date.ClosureDate — 20 февраля, 11:00, разница должна составлять 2 часа.

Можно ли это сделать, используя Javascript, момент или любую другую библиотеку?


person Vignesh Subramanian    schedule 19.02.2018    source источник
comment
вы можете делать такие вещи, как момент (дата). добавить (1, 'час') или момент (дата). вычесть (1, 'час'), поэтому просто добавьте поток управления, чтобы указать, когда это должно произойти и в каком количестве   -  person Robbie Milejczak    schedule 19.02.2018


Ответы (1)


Вы можете использовать эту функцию, которая возвращает результат в миллисекундах. Форматирование HH:mm:ss сохраняется за его пределами, так как это не будет хорошо отображаться, если период охватывает несколько дней:

function officeTimeDiff(a, b) {
    a = moment(a);
    b = moment(b);
    if (b.diff(a) < 0) return 0;
    if (a.hour() <   9) a = a.hour(9).startOf('hour');
    if (a.hour() >= 18) a = a.add(1, 'day').hour(9).startOf('hour');    
    if (b.hour() <   9) b = b.add(-1, 'day').hour(18).startOf('hour');
    if (b.hour() >= 18) b = b.hour(18).startOf('hour');
    const diff = b.clone().year(a.year()).month(a.month()).date(a.date()).diff(a);
    a = a.startOf('day');
    b = b.startOf('day');
    return diff + moment.duration(b.diff(a, 'day') * 9, 'hour').asMilliseconds();
}

console.log(moment.utc(officeTimeDiff('2018-02-19 19:22:09', '2018-02-20 11:01:08')).format('HH:mm:ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.0/moment.min.js"></script>

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

person trincot    schedule 19.02.2018