user13645930
user13645930

Reputation: 13

Time Duration in python

Given two strings :

      ex:

      start_time="3:00 PM" 
      Duration="3:10"

Start time is in 12-hour clock format (ending in AM or PM), and duration time that indicates the number of hours and minutes

Assume that the start times are valid times.The minutes in the duration time will be a whole number less than 60, but the hour can be any whole number.

I need to add the duration time to the start time and return the result (WITHOUT ANY USE OF LIBRARIES). The result should be in 12-hour clock format (ending in AM or PM) indicates the number of hours and minutes

      ex:

      start_time = "6:30 PM"
      Duration =  "205:12"
      # Returns: 7:42 AM
      

I Tried and finally got the required answer but unable to produce correct AM or PM for the result after addition.

      what I Tried:
      
      start_time = "6:30 PM"
      Duration =  "205:12"
       
     #My answer =7:42 
     #expected :7:42 AM

Can someone help me with the logic to produce correct AM or PM after addition of start time and Duration.

def add_time(a,b):

a=a.split()
b=b.split()

be=int(a[0][:a[0].find(':')])
af=int(a[0][a[0].find(':')+1:])
be1 = int(b[0][:b[0].find(':')])
af1 = int(b[0][b[0].find(':') + 1:])

return(((be+be1)//24)+1)
s=be+(be1)%12
p=af+af1

if ((s>12) and (p<60)) :
    return(str(s-12)+":"+str(p))

elif ((s<12) and (p>60))  :
    f = p-60
    if len(str(f))<=1:
      return(str(s+1)+":"+str('0'+str(f)))
    else:
      return (str(s + 1)+":"+(str(f)))

elif ((s<12) and (p<60)) :
    return(str(s)+":"+str(p))

elif ((s>12) and (p>60)):
    f=p-60
    if len(str(f)) <= 1:
        return (str((s -12)+1)+":"+('0' + str(f)))
    else:
        return (str((s -12)+1)+":"+(str(f)))





   print(add_time("10:10 PM", "3:30"))
   # Returns: 1:40 AM 
   print(add_time("11:43 PM", "24:20"))
   # Returns: 12:03 AM
  

       

Upvotes: 0

Views: 842

Answers (1)

David Wierichs
David Wierichs

Reputation: 545

Your code does not seem to cover all edge cases, e.g. add_time("11:43 PM", "1:20") returns None because the case s==12 is not covered. Therefore one should put <= instead of < in the respective if conditions. The case where the addition of the minutes leads to hours greater than 12 although the addition of the hours itself did not, is not covered either. So we should check the minutes first and the hours after that instead of simultaneously.
To make the code more readable, we use f-strings and can use str.split() with an argument, forgive me for changing the code quite a bit:

def add_time(a,b):                                                                                                                                              
    start = a.split()                                                           
    start_h, start_m = [int(val) for val in start[0].split(':')]                
    start_app = start[1]                                                        
    dur_h, dur_m = [int(val) for val in b.split(':')]                           
                                                                                
    end_m = start_m+dur_m                                                       
    end_h = end_m//60                                                           
    end_m %= 60                                                                 
    end_h += start_h+dur_h                                                      
                                                                                
    if (end_h//12)%2==0:                                                        
        end_app = start_app                                                     
    else:                                                                       
        end_app = 'AM' if start_app=='PM' else 'PM'                             
                                                                                
    return f'{end_h:02}:{end_m:02} {end_app}'   

Upvotes: 0

Related Questions