Как рассчитать количество часов между датами при 8-часовом рабочем дне и учете выходных? (ВБ.нет)

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

Например, дата1 — это 1/23/2020 9:00:00 AM, дата начала, а дата2 — это 1/27/2020 1:30:00 PM, время окончания.

Если я запускаю этот код:

Dim hours As double = DateDiff(DateInterval.hour, date1, date2)

это даст мне общее количество часов, но будет включать выходные и не фильтровать его для 8-часового рабочего дня.

Как я могу отфильтровать рабочие дни и выходные? Любая помощь в уточнении этого будет оценена


person C. Clements    schedule 30.01.2020    source источник
comment
Вы включаете время в дату начала и дату окончания, но вы предполагаете, что промежуточные дни всегда составляют 8 часов?   -  person Anu6is    schedule 30.01.2020
comment
@ Anu6is Да, все дни между днями, для которых не указан конкретный час, будут назначены как 8 часов. только этот день (конец или начало) начнет расчет с указанного часа.   -  person C. Clements    schedule 30.01.2020


Ответы (2)


Один из возможных вариантов

'Get all days between the start date and the end date
Dim midDays As Date() = Enumerable.Range(0, endDate.Subtract(startDate.AddDays(1)).Days).Select(Function(offset) startDate.AddDays(offset)).ToArray
'Filter out any weekend days
Dim weekdays As Date() = midDays.Where(Function(day) day.DayOfWeek <> DayOfWeek.Saturday AndAlso day.DayOfWeek <> DayOfWeek.Sunday).ToArray
'Assume all days are a full 8 hours
Dim hoursWorked As Decimal = weekdays.Count * 8

По сути, это создает список всех дней между начальной и конечной датой. Удаляет выходные из списка и рассчитывает 8 часов на каждый оставшийся день.

Конечно, вы затем добавили бы часы с первого и последнего дня к общему количеству.

person Anu6is    schedule 30.01.2020

Простой цикл

    Dim td As DateTime
    If endDate < startDate Then
        'switch
        td = endDate
        endDate = startDate
        startDate = td
    End If
    Dim hours As Integer = 0
    td = startDate
    While td < endDate
        If td.DayOfWeek <> DayOfWeek.Saturday AndAlso td.DayOfWeek <> DayOfWeek.Sunday Then
            hours += 8
        End If
        td = td.AddDays(1)
    End While
person dbasnett    schedule 30.01.2020