...

Подсчет рабочих дней между датами #TDate #TTime

Тема в разделе "Скрипты и разработка", создана пользователем nazarov, 25 июн 2023.

  1. nazarov

    nazarov Активный участник

    Считает рабочие дни. Не учитывает праздники. Отсчет от 12:00:00:00 - проверить правильно ли считает, если старт в пятницу, а окончание в понедельник.


    Код:
    
    async function calculateDuration(): Promise<void> {


    const 
    dayInMs = 1000 * 60 * 60 * 24

        
    const startTime = new TTime(12, 0, 0, 0)

        const 
    endTime = new TTime(12, 0, 0, 0)

        if(
    Context.data.startDate

           
    && Context.data.endDate

           
    && Context.data.startDate.before(Context.data.endDate)) {

        

            
    //получаем количество дней

            
    Context.data.trip_duration = Math.round(Math.abs(Context.data.endDate.asDatetime(endTime).asDate().getTime() -

            
    Context.data.startDate.asDatetime(startTime).asDate().getTime()) / dayInMs);


            
    //получаем даты

            
    let beginDate = Context.data.startDate.asDatetime(startTime).asDate();

            
    let overDate = Context.data.endDate.asDatetime(endTime).asDate();


            
    //получаем копии дат

            
    let s = new Date(+beginDate);

            
    let e = new Date(+overDate);


            
    //устанавливаем отсчет дат с полудня

            
    s.setHours(12, 0, 0, 0);

            
    e.setHours(12, 0, 0, 0);


            
    let totalDays = Math.round((e.getTime() - s.getTime()) / dayInMs);

            
    let weeks = totalDays / 7 | 0;

            
    let d = weeks * 5;

            if (
    totalDays % 7) {

                
    s.setDate(s.getDate() + weeks * 7);



            while (
    s < e) {

                
    s.setDate(s.getDate() + 1);

                if (
    s.getDay() != 0 && s.getDay() != 6) {

                    ++
    d;



        }

            }

            }

            if(
    beginDate.getDay() === 5) {

                    
    d = d + 1;

            }

        

            
    Context.data.trip_duration = d;


            
    //если дата раньше текущей, то ноль

            
    const nowDate = new TDate();

            if(
    Context.data.startDate.before(nowDate)) {

                
    Context.data.trip_duration = 0;

            }

            
    //умножаем на суточные в день

            
    Context.data.sum_allowance = Context.fields.sum_allowance.create(Context.data.trip_duration * 2000)

        }

    }

    Вложения: