首页 文章

如何使用Python计算两个日期之间的天数?

提问于
浏览
377

如果我有两个日期(例如 '8/18/2008''9/26/2008' ),获取两个日期之间的天数的最佳方法是什么?

10 回答

  • 5

    以下是解决此问题的三种方法:

    from datetime import datetime
    
    Now = datetime.now()
    StartDate = datetime.strptime(str(Now.year) +'-01-01', '%Y-%m-%d')
    NumberOfDays = (Now - StartDate)
    
    print(NumberOfDays.days)                     # Starts at 0
    print(datetime.now().timetuple().tm_yday)    # Starts at 1
    print(Now.strftime('%j'))                    # Starts at 1
    
  • 12

    如果您有两个日期对象,则可以减去它们 .

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

    文档的相关部分:https://docs.python.org/library/datetime.html .

  • 25

    使用datetime的力量:

    from datetime import datetime
    date_format = "%m/%d/%Y"
    a = datetime.strptime('8/18/2008', date_format)
    b = datetime.strptime('9/26/2008', date_format)
    delta = b - a
    print delta.days # that's it
    
  • 109

    圣诞节前几天:

    >>> import datetime
    >>> today = datetime.date.today()
    >>> someday = datetime.date(2008, 12, 25)
    >>> diff = someday - today
    >>> diff.days
    86
    

    更多算术here .

  • 1

    你想要datetime模块 .

    >>> from datetime import datetime, timedelta 
    >>> datetime(2008,08,18) - datetime(2008,09,26) 
    datetime.timedelta(4)
    

    或者其他例子:

    Python 2.5.2 (r252:60911, Feb 22 2008, 07:57:53) 
    [GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>> import datetime 
    >>> today = datetime.date.today() 
    >>> print today 
    2008-09-01 
    >>> last_year = datetime.date(2007, 9, 1) 
    >>> print today - last_year 
    366 days, 0:00:00
    

    正如指出here

  • 593
    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)
    
  • 2

    它也可以通过 arrow 轻松完成:

    import arrow
    
    a = arrow.get('2017-05-09')
    b = arrow.get('2017-05-11')
    
    delta = (b-a)
    print delta.days
    

    供参考:http://arrow.readthedocs.io/en/latest/

  • 0

    没有使用Lib只是纯代码:

    #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()
    
  • 6

    为了计算日期和时间,有几个选项,但我会写一些简单的方法:

    import datetime
    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()
    

    希望能帮助到你

  • 8
    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')
    

    当然,这假定您已经验证您的日期格式为 r'\d+/\d+/\d+' .

相关问题