2010-06-28 15 views
9

que he dado como éstas:cadenas de fecha Python diferencia de fechas legible por humanos

Mon Jun 28 10:51:07 2010 
Fri Jun 18 10:18:43 2010 
Wed Dec 15 09:18:43 2010 

¿Cuál es una forma de pitón útil para calcular la diferencia en días? Suponiendo que la zona horaria es la misma.

Las cadenas fueron devueltas por los comandos de linux.

Editar: Gracias, tantas buenas respuestas

Respuesta

5
#!/usr/bin/env python 

import datetime 

def hrdd(d1, d2): 
    """ 
    Human-readable date difference. 
    """ 
    _d1 = datetime.datetime.strptime(d1, "%a %b %d %H:%M:%S %Y") 
    _d2 = datetime.datetime.strptime(d2, "%a %b %d %H:%M:%S %Y") 
    diff = _d2 - _d1 
    return diff.days # <-- alternatively: diff.seconds 

if __name__ == '__main__': 
    d1 = "Mon Jun 28 10:51:07 2010" 
    d2 = "Fri Jun 18 10:18:43 2010" 
    d3 = "Wed Dec 15 09:18:43 2010" 

    print hrdd(d1, d2) 
    # ==> -11 
    print hrdd(d2, d1) 
    # ==> 10 
    print hrdd(d1, d3) 
    # ==> 169 
    # ... 
6

Use strptime.

Ejemplo de uso:

from datetime import datetime 

my_date = datetime.strptime('Mon Jun 28 10:51:07 2010', '%a %b %d %H:%M:%S %Y') 
print my_date 

EDIT:

Usted puede también imprimir la diferencia de tiempo en un formato legible por humanos, así:

from time import strptime 
from datetime import datetime 

def date_diff(older, newer): 
    """ 
    Returns a humanized string representing time difference 

    The output rounds up to days, hours, minutes, or seconds. 
    4 days 5 hours returns '4 days' 
    0 days 4 hours 3 minutes returns '4 hours', etc... 
    """ 

    timeDiff = newer - older 
    days = timeDiff.days 
    hours = timeDiff.seconds/3600 
    minutes = timeDiff.seconds%3600/60 
    seconds = timeDiff.seconds%3600%60 

    str = "" 
    tStr = "" 
    if days > 0: 
     if days == 1: tStr = "day" 
     else:   tStr = "days" 
     str = str + "%s %s" %(days, tStr) 
     return str 
    elif hours > 0: 
     if hours == 1: tStr = "hour" 
     else:   tStr = "hours" 
     str = str + "%s %s" %(hours, tStr) 
     return str 
    elif minutes > 0: 
     if minutes == 1:tStr = "min" 
     else:   tStr = "mins"   
     str = str + "%s %s" %(minutes, tStr) 
     return str 
    elif seconds > 0: 
     if seconds == 1:tStr = "sec" 
     else:   tStr = "secs" 
     str = str + "%s %s" %(seconds, tStr) 
     return str 
    else: 
     return None 

older = datetime.strptime('Mon Jun 28 10:51:07 2010', '%a %b %d %H:%M:%S %Y') 
newer = datetime.strptime('Tue Jun 28 10:52:07 2010', '%a %b %d %H:%M:%S %Y') 
print date_diff(older, newer) 

Original source para el fragmento de tiempo .

5
>>> import datetime 
>>> a = datetime.datetime.strptime("Mon Jun 28 10:51:07 2010", "%a %b %d %H:%M:%S %Y") 
>>> b = datetime.datetime.strptime("Fri Jun 18 10:18:43 2010", "%a %b %d %H:%M:%S %Y") 
>>> c = a-b 
>>> c.days 
10 
0

Prueba esto:

>>> (datetime.datetime.strptime("Mon Jun 28 10:51:07 2010", "%a %b %d %H:%M:%S %Y") - datetime.datetime.strptime("Fri Jun 18 10:18:43 2010", "%a %b %d %H:%M:%S %Y")).days 
10 
0
from datetime import datetime 

resp = raw_input("What is the first date ?") 
date1 = datetime.strptime(resp,"%a %b %d %H:%M:%S %Y") 
resp2 = raw_input("What is the second date ?") 
date2 = datetime.strptime(resp2,"%a %b %d %H:%M:%S %Y") 
res = date2-date1 
print str(res) 

Para obtener más información sobre cómo imprimir un objeto timedelta mejor, se puede ver this previous post.

2

Esto no es lo mismo que las otras respuestas, pero podría ser útil para alguien que quiera mostrar algo más legible (y menos preciso). Hice esto rápidamente, así que sugerencias bienvenidas.

(Tenga en cuenta que se supone until_seconds es la marca de tiempo más tarde.)

def readable_delta(from_seconds, until_seconds=None): 
    '''Returns a nice readable delta. 

    readable_delta(1, 2)   # 1 second ago 
    readable_delta(1000, 2000)  # 16 minutes ago 
    readable_delta(1000, 9000)  # 2 hours, 133 minutes ago 
    readable_delta(1000, 987650) # 11 days ago 
    readable_delta(1000)   # 15049 days ago (relative to now) 
    ''' 

    if not until_seconds: 
     until_seconds = time.time() 

    seconds = until_seconds - from_seconds 
    delta = datetime.timedelta(seconds=seconds) 

    # deltas store time as seconds and days, we have to get hours and minutes ourselves 
    delta_minutes = delta.seconds // 60 
    delta_hours = delta_minutes // 60 

    ## show a fuzzy but useful approximation of the time delta 
    if delta.days: 
     return '%d day%s ago' % (delta.days, plur(delta.days)) 
    elif delta_hours: 
     return '%d hour%s, %d minute%s ago' % (delta_hours, plur(delta_hours), delta_minutes, plur(delta_minutes)) 
    elif delta_minutes: 
     return '%d minute%s ago' % (delta_minutes, plur(delta_minutes)) 
    else: 
     return '%d second%s ago' % (delta.seconds, plur(delta.seconds)) 

def plur(it): 
    '''Quick way to know when you should pluralize something.''' 
    try: 
     size = len(it) 
    except TypeError: 
     size = int(it) 
    return '' if size==1 else 's' 
Cuestiones relacionadas