1

I have the following problem:

  1. Choose a start date.
  2. Enter the number of working hours
  3. Returns the actual working day (excluding Saturday and Sunday).

Conditions:

  • 1 working week 5 days (Monday to Friday)
  • An 8 hour working day

Here's my implementation so far, but somehow it only works for even weeks:

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;
    return [year, month, day].join('-');
}

$('#startTimeProject,#doTimeProject').change(function() {
    var startTime = $('#startTimeProject').val();
    var doTime = $('#doTimeProject').val();

    if (doTime == null) {
        return;
    }

    const d = new Date(startTime);
    var currentDay = d.getDay();
    startTime = new Date(startTime);

    if (currentDay == 0) {
        startTime.setDate(startTime.getDate() + 1);
    }
    if (currentDay == 6) {
        startTime.setDate(startTime.getDate() + 2);
    }

    startTime = Date.parse(startTime);
    $('#startTimeProject').val(formatDate(startTime));
    var numberWeek = Math.floor(doTime / 40);

    if (numberWeek >= 1) {
        doTime = Number(doTime) + numberWeek * 16;
    }

    var dayTime = Math.ceil(doTime / 8);
    var endTime = new Date(startTime);
    endTime.setDate(endTime.getDate() + dayTime);
    endTime = Date.parse(endTime);
    $('#endTimeProject').val(formatDate(endTime));
})

How can I calculate the end date that matches the conditions listed?

RobG
  • 142,382
  • 31
  • 172
  • 209
unLimit
  • 11
  • 3

1 Answers1

-1

i have answer

 $('#startTimeProject,#doTimeProject').change(function () {
            // start time
            var startTime = $('#startTimeProject').val();
            // do time
            var doTime = $('#doTimeProject').val();
            if (doTime == null) {
                return;
            }
            const d = new Date(startTime);
            var currentDay = d.getDay();
            
            startTime = new Date(startTime);
            
            // If the start date is Sunday, it will be considered as Monday
            if (currentDay == 0) {
                startTime.setDate(startTime.getDate() + 1);
            }
            // If the start date is Saturday, it will be considered as Monday
            if (currentDay == 6) {
                startTime.setDate(startTime.getDate() + 2);
            }
            startTime = Date.parse(startTime)
           
            $('#startTimeProject').val(formatDate(startTime));
            
            var numberWeek = Math.floor(doTime / 40);
            // over 1 week, each time expires + 16h
            var dayTime = Math.ceil(doTime / 8);// 1 day = 8 hours of work
            const dNew = new Date(startTime);
            var currentDayNew = dNew.getDay();
            if (numberWeek == 1) {
                // doTime = Number(doTime) + numberWeek * 16;
                // if = 1 week then + add 2 days
                dayTime = dayTime + 2;
            }
            // if it is more than 1 week, it will still be calculated the same, only + add 2 days of the previous week
            else if (numberWeek > 1) {
                changeTime = dayTime - (numberWeek * 5);
              
                if (changeTime == 0) {
                    dayTime = Math.ceil(doTime / 8) + numberWeek * 2;
                } else {
                    switch (currentDayNew) {
                        
                        case 1:
                            dayTime = dayTime + numberWeek * 5;
                            break;
                        case 2:
                           
                            if (changeTime == 4) {
                                dayTime = changeTime + 2 + numberWeek * 7;
                            } else {
                                dayTime = changeTime + numberWeek * 7;
                            }
                            break;
                        case 3:
                            
                            if (changeTime == 4) {
                                dayTime = changeTime + 2 + numberWeek * 7;
                            }
                            else if (changeTime == 3) {
                                dayTime = changeTime + 2 + numberWeek * 7;
                            }
                            else {
                                dayTime = changeTime + numberWeek * 7;
                            }
                            break;
                        case 4:
                           
                            if (changeTime == 4) {
                                dayTime = changeTime + 2 + numberWeek * 7;
                            }
                            else if (changeTime == 3) {
                                dayTime = changeTime + 2 + numberWeek * 7;
                            }
                            else if (changeTime == 2) {
                                dayTime = changeTime + 2 + numberWeek * 7;
                            }
                            else {
                                dayTime = changeTime + numberWeek * 7;
                            }
                            break;
                        case 5:
                           
                            dayTime = changeTime + 2 + numberWeek * 7;
                            break;
                    }
                }
            }
            else {
                //less than 1 week => dayTime will be less than 5
                switch (currentDayNew) {
                   // monday won't increase anything
                    case 1:
                        break;
                    case 2:
                        // tuesday, daytime =  4 then bonus 2 days
                        if (dayTime == 4) {
                            dayTime = dayTime + 2
                        }
                        break;
                    case 3:
                        // Wednesday, daytime =  4,daytime =  3 then bonus 2 days
                        if (dayTime == 4) {
                            dayTime = dayTime + 2
                        }
                        if (dayTime == 3) {
                            dayTime = dayTime + 2
                        }
                        break;
                    case 4:
                        // Thusday, daytime =  4,daytime =  3,daytime =  2 then bonus 2 days
                        if (dayTime == 4) {
                            dayTime = dayTime + 2
                        }
                        if (dayTime == 3) {
                            dayTime = dayTime + 2
                        }
                        if (dayTime == 2) {
                            dayTime = dayTime + 2
                        }
                        break;
                    case 5:
                        // Friday bonus 2 days
                        dayTime = dayTime + 2
                        break;
                }
            } 
            var endTime = new Date(startTime);
            endTime.setDate(endTime.getDate() + dayTime);
            endTime = Date.parse(endTime)
            $('#endTimeProject').val(formatDate(endTime));
        })
unLimit
  • 11
  • 3
  • Code–only answers aren't helpful. A good answer should explain why the OP has their issue and how your answer fixes it. Also, where the timestamp format is yyyy-mm-dd, `new Date(timestamp)` is fraught, see [*Why does Date.parse give incorrect results?*](https://stackoverflow.com/questions/2587345/why-does-date-parse-give-incorrect-results) – RobG Oct 26 '22 at 09:12
  • no, input is : 'yyyy-mm-dd' not timestamp. this code is correct in my project. – unLimit Oct 26 '22 at 10:05
  • 'yyyy-mm-dd' is a [timestamp](https://en.wikipedia.org/wiki/Timestamp). – RobG Oct 27 '22 at 11:37