How to calculate number of days between two given dates?

前端 未结 13 1293
梦如初夏
梦如初夏 2020-11-22 06:29

If I have two dates (ex. \'8/18/2008\' and \'9/26/2008\'), what is the best way to get the number of days between these two dates?

相关标签:
13条回答
  • 2020-11-22 06:50

    For calculating dates and times, there are several options but I will write the simple way:

    from datetime import timedelta, datetime, date
    import dateutil.relativedelta
    
    # current time
    date_and_time = datetime.datetime.now()
    date_only = date.today()
    time_only = datetime.datetime.now().time()
    
    # calculate date and time
    result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
    
    # calculate dates: years (-/+)
    result = date_only - dateutil.relativedelta.relativedelta(years=10)
    
    # months
    result = date_only - dateutil.relativedelta.relativedelta(months=10)
    
    # days
    result = date_only - dateutil.relativedelta.relativedelta(days=10)
    
    # calculate time 
    result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
    result.time()
    

    Hope it helps

    0 讨论(0)
  • 2020-11-22 06:52

    If you have two date objects, you can just subtract them, which computes a timedelta object.

    from datetime import date
    
    d0 = date(2008, 8, 18)
    d1 = date(2008, 9, 26)
    delta = d1 - d0
    print(delta.days)
    

    The relevant section of the docs: https://docs.python.org/library/datetime.html.

    See this answer for another example.

    0 讨论(0)
  • 2020-11-22 06:53
    from datetime import datetime
    start_date = datetime.strptime('8/18/2008', "%m/%d/%Y")
    end_date = datetime.strptime('9/26/2008', "%m/%d/%Y")
    print abs((end_date-start_date).days)
    
    0 讨论(0)
  • 2020-11-22 06:54

    without using Lib just pure code:

    #Calculate the Days between Two Date
    
    daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    def isLeapYear(year):
    
        # Pseudo code for this algorithm is found at
        # http://en.wikipedia.org/wiki/Leap_year#Algorithm
        ## if (year is not divisible by 4) then (it is a common Year)
        #else if (year is not divisable by 100) then (ut us a leap year)
        #else if (year is not disible by 400) then (it is a common year)
        #else(it is aleap year)
        return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
    
    def Count_Days(year1, month1, day1):
        if month1 ==2:
            if isLeapYear(year1):
                if day1 < daysOfMonths[month1-1]+1:
                    return year1, month1, day1+1
                else:
                    if month1 ==12:
                        return year1+1,1,1
                    else:
                        return year1, month1 +1 , 1
            else: 
                if day1 < daysOfMonths[month1-1]:
                    return year1, month1, day1+1
                else:
                    if month1 ==12:
                        return year1+1,1,1
                    else:
                        return year1, month1 +1 , 1
        else:
            if day1 < daysOfMonths[month1-1]:
                 return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                        return year1, month1 +1 , 1
    
    
    def daysBetweenDates(y1, m1, d1, y2, m2, d2,end_day):
    
        if y1 > y2:
            m1,m2 = m2,m1
            y1,y2 = y2,y1
            d1,d2 = d2,d1
        days=0
        while(not(m1==m2 and y1==y2 and d1==d2)):
            y1,m1,d1 = Count_Days(y1,m1,d1)
            days+=1
        if end_day:
            days+=1
        return days
    
    
    # Test Case
    
    def test():
        test_cases = [((2012,1,1,2012,2,28,False), 58), 
                      ((2012,1,1,2012,3,1,False), 60),
                      ((2011,6,30,2012,6,30,False), 366),
                      ((2011,1,1,2012,8,8,False), 585 ),
                      ((1994,5,15,2019,8,31,False), 9239),
                      ((1999,3,24,2018,2,4,False), 6892),
                      ((1999,6,24,2018,8,4,False),6981),
                      ((1995,5,24,2018,12,15,False),8606),
                      ((1994,8,24,2019,12,15,True),9245),
                      ((2019,12,15,1994,8,24,True),9245),
                      ((2019,5,15,1994,10,24,True),8970),
                      ((1994,11,24,2019,8,15,True),9031)]
    
        for (args, answer) in test_cases:
            result = daysBetweenDates(*args)
            if result != answer:
                print "Test with data:", args, "failed"
            else:
                print "Test case passed!"
    
    test()
    
    0 讨论(0)
  • 2020-11-22 06:54

    There is also a datetime.toordinal() method that was not mentioned yet:

    import datetime
    print(datetime.date(2008,9,26).toordinal() - datetime.date(2008,8,18).toordinal())  # 39
    

    https://docs.python.org/3/library/datetime.html#datetime.date.toordinal

    date.toordinal()

    Return the proleptic Gregorian ordinal of the date, where January 1 of year 1 has ordinal 1. For any date object d, date.fromordinal(d.toordinal()) == d.

    Seems well suited for calculating days difference, though not as readable as timedelta.days.

    0 讨论(0)
  • 2020-11-22 06:55

    from datetime import date
    def d(s):
      [month, day, year] = map(int, s.split('/'))
      return date(year, month, day)
    def days(start, end):
      return (d(end) - d(start)).days
    print days('8/18/2008', '9/26/2008')
    

    This assumes, of course, that you've already verified that your dates are in the format r'\d+/\d+/\d+'.

    0 讨论(0)
提交回复
热议问题