...

Подсчет рабочих дней между датами #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(12000)

        const 
    endTime = new TTime(12000)

        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(12000);

            
    e.setHours(12000);


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

            
    let weeks totalDays 0;

            
    let d weeks 5;

            if (
    totalDays 7) {

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



            while (
    e) {

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

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

                    ++
    d;



        }

            }

            }

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

                    
    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)

        }

    }

    Вложения: