How do I find the time difference between two datetime objects in python?

前端 未结 17 1187
無奈伤痛
無奈伤痛 2020-11-22 11:06

How do I tell the time difference in minutes between two datetime objects?

17条回答
  •  温柔的废话
    2020-11-22 11:43

    Using datetime example

    >>> from datetime import datetime
    >>> then = datetime(2012, 3, 5, 23, 8, 15)        # Random date in the past
    >>> now  = datetime.now()                         # Now
    >>> duration = now - then                         # For build-in functions
    >>> duration_in_s = duration.total_seconds()      # Total number of seconds between dates
    

    Duration in years

    >>> years = divmod(duration_in_s, 31536000)[0]    # Seconds in a year=365*24*60*60 = 31536000.
    

    Duration in days

    >>> days  = duration.days                         # Build-in datetime function
    >>> days  = divmod(duration_in_s, 86400)[0]       # Seconds in a day = 86400
    

    Duration in hours

    >>> hours = divmod(duration_in_s, 3600)[0]        # Seconds in an hour = 3600
    

    Duration in minutes

    >>> minutes = divmod(duration_in_s, 60)[0]        # Seconds in a minute = 60
    

    Duration in seconds

    [!] See warning about using duration in seconds in the bottom of this post

    >>> seconds = duration.seconds                    # Build-in datetime function
    >>> seconds = duration_in_s
    

    Duration in microseconds

    [!] See warning about using duration in microseconds in the bottom of this post

    >>> microseconds = duration.microseconds          # Build-in datetime function
    

    Total duration between the two dates

    >>> days    = divmod(duration_in_s, 86400)        # Get days (without [0]!)
    >>> hours   = divmod(days[1], 3600)               # Use remainder of days to calc hours
    >>> minutes = divmod(hours[1], 60)                # Use remainder of hours to calc minutes
    >>> seconds = divmod(minutes[1], 1)               # Use remainder of minutes to calc seconds
    >>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0]))
    

    or simply:

    >>> print(now - then)
    

    Edit 2019 Since this answer has gained traction, I'll add a function, which might simplify the usage for some

    from datetime import datetime
    
    def getDuration(then, now = datetime.now(), interval = "default"):
    
        # Returns a duration as specified by variable interval
        # Functions, except totalDuration, returns [quotient, remainder]
    
        duration = now - then # For build-in functions
        duration_in_s = duration.total_seconds() 
        
        def years():
          return divmod(duration_in_s, 31536000) # Seconds in a year=31536000.
    
        def days(seconds = None):
          return divmod(seconds if seconds != None else duration_in_s, 86400) # Seconds in a day = 86400
    
        def hours(seconds = None):
          return divmod(seconds if seconds != None else duration_in_s, 3600) # Seconds in an hour = 3600
    
        def minutes(seconds = None):
          return divmod(seconds if seconds != None else duration_in_s, 60) # Seconds in a minute = 60
    
        def seconds(seconds = None):
          if seconds != None:
            return divmod(seconds, 1)   
          return duration_in_s
    
        def totalDuration():
            y = years()
            d = days(y[1]) # Use remainder to calculate next variable
            h = hours(d[1])
            m = minutes(h[1])
            s = seconds(m[1])
    
            return "Time between dates: {} years, {} days, {} hours, {} minutes and {} seconds".format(int(y[0]), int(d[0]), int(h[0]), int(m[0]), int(s[0]))
    
        return {
            'years': int(years()[0]),
            'days': int(days()[0]),
            'hours': int(hours()[0]),
            'minutes': int(minutes()[0]),
            'seconds': int(seconds()),
            'default': totalDuration()
        }[interval]
    
    # Example usage
    then = datetime(2012, 3, 5, 23, 8, 15)
    now = datetime.now()
    
    print(getDuration(then)) # E.g. Time between dates: 7 years, 208 days, 21 hours, 19 minutes and 15 seconds
    print(getDuration(then, now, 'years'))      # Prints duration in years
    print(getDuration(then, now, 'days'))       #                    days
    print(getDuration(then, now, 'hours'))      #                    hours
    print(getDuration(then, now, 'minutes'))    #                    minutes
    print(getDuration(then, now, 'seconds'))    #                    seconds
    

    Warning: Caveat about built-in .seconds and .microseconds
    datetime.seconds and datetime.microseconds are capped to [0,86400) and [0,10^6) respectively.

    They should be used carefully if timedelta is bigger than the max returned value.

    Examples:

    end is 1h and 200μs after start:

    >>> start = datetime(2020,12,31,22,0,0,500)
    >>> end = datetime(2020,12,31,23,0,0,700)
    >>> delta = end - start
    >>> delta.microseconds
    RESULT: 200
    EXPECTED: 3600000200
    

    end is 1d and 1h after start:

    >>> start = datetime(2020,12,30,22,0,0)
    >>> end = datetime(2020,12,31,23,0,0)
    >>> delta = end - start
    >>> delta.seconds
    RESULT: 3600
    EXPECTED: 90000
    

提交回复
热议问题