Search code examples
pythontimehour

Add hours to workday in python


I need the following script to compute the working hours from 9 am to 6 pm, so that if I add 5 hours it will be added from 9 am the next day. Example: if it is now 5 pm and I add 5 hours and the working day ends at 6 pm, the output would be: 13 hours. 17 + 1 = 18 and 9 + 4 = 13 hs

So far the script computes hours regardless of the labor restriction.

from datetime import datetime, timedelta
  
updated = ( datetime.now() +
           timedelta( hours = 5 )).strftime('%H:%M:%S')
  
print( updated )

--22:12:00


Solution

  • Here you are:

    workday_begin = time(9)
    workday_end = time(18)
    
    # compute workday length
    workday_hours = datetime.combine(date.today(), workday_end) - datetime.combine(date.today(), workday_begin)
    
    # this is timedelta from your example
    duration_hours = timedelta(hours=17)
    
    # ignore times longer than a workday
    day_cnt = 0  # this could be used to know how many day we've skipped, not part of question tho
    while duration_hours > workday_hours:
        day_cnt += 1
        duration_hours -= workday_hours
    
    now = datetime.now()
    # now = datetime(2021,12,10,11,25,16)
    if workday_begin < now.time() < workday_end:
        # now is in work-hours
        if datetime.combine(date.today(), workday_end) - now < duration_hours:
            # duration would exceed work-hours, jumping to next day
            day_cnt += 1
            duration_hours -= (datetime.combine(date.today(), workday_end) - now)
            updated = datetime.combine(date.today(), workday_begin) + duration_hours
        else:
            # everything is fine, just add hours
            updated = now + duration_hours
    else:
        # now is not in work-hours. Add remaining duration to workday begin
        updated = datetime.combine(date.today(), workday_begin) + duration_hours
    
    # keep just a time part
    updated = updated.time().strftime('%H:%M:%S')
    
    print( updated )
    

    I hope I understood your question.