2008-09-29 33 views

risposta

480

Se si dispone di due oggetti data, è possibile sottrarli.

from datetime import date 

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

La sezione della documentazione: https://docs.python.org/library/datetime.html

+3

che sarebbe meglio essere 'd1 - d0' ad avere un risultato positivo – Tianqing

88

Usando il potere del 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 
+4

in realtà, la classe data sarebbe più appropriato in questo caso di datetime. –

+6

@JeremyCantrell Eppure, anche otto anni dopo, 'date' non ha ancora il suo equivalente a' strptime() '. – JAB

19

giorni fino a Natale:

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

Più aritmetica here.

7

Si desidera il modulo datetime.

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

O altro esempio:

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 

Come sottolineato here

6
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

Si potrebbe voler guardare questo. Ho questi errori su 2.7.3 Python che esegue il tuo esempio. File "", la linea 1, in File "/usr/local/lib/python2.7/_strptime.py", la linea 325, in _strptime (data_string, formato)) ValueError: dati di tempo '8/18/2008 'non corrisponde al formato'% Y-% m-% d ' >>> Traceback (ultima chiamata ultima): File "", riga 1, in File "/ usr/local/lib /python2.7/_strptime.py ", riga 325, in _strptime (data_string, format)) ValueError: i dati di tempo '9/26/2008' non corrispondono al formato '% Y-% m-% d' >>> – octopusgrabbus

+0

@octopusgrabbus Il formato la stringa era del tutto sbagliata.La versione modificata dovrebbe funzionare – Christopher

+1

Questo non aggiunge nulla di nuovo rispetto alle risposte date 4 anni prima. -1 –

2

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

Ciò presuppone, naturalmente, che hai già verificato che il vostro le date sono nel formato r'\d+/\d+/\d+'.

+1

Questo non aggiunge nulla di nuovo rispetto alle risposte date 8 anni prima. -1. –

+0

La differenza principale La maggior parte delle altre risposte non si è nemmeno preoccupata di spiegare il fatto che l'OP aveva le sue date come stringhe e coloro che ne hanno fatto conto hanno usato in gran parte formattatori più complicati di quanto strettamente necessario. int, s.split ('/')) '. Non esattamente rivoluzionario, ma di nuovo questa domanda è piuttosto stupida di base: la mia risposta mostra solo un altro modo per scuoiare il gatto. –

+0

Ha anche menzionato la convalida delle date nel formato corretto e una regex di convalida della prima approssimazione. Quali altri no. –

2

Per calcolare date e orari ci sono diverse opzioni, ma io scriverò il modo semplice:

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

Spero che sia utile

1

senza utilizzare il codice Lib solo pura:

#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() 
Problemi correlati