2010-06-28 6 views
9

I Datumsstrings wie diese gegeben haben:Python Menschen lesbare Datum Unterschied

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

Was ist ein handliches Python Möglichkeit, den Unterschied in Tagen zu berechnen? Angenommen, die Zeitzone ist gleich.

Die Zeichenfolgen wurden von Linux-Befehlen zurückgegeben.

Edit: Vielen Dank, so viele gute Antworten

Antwort

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

Verwendung strptime.

Verwendungsbeispiel:

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:

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 für die Zeit Schnipsel:

Sie auch die Zeitdifferenz in einem für Menschen lesbaren Form, wie so drucken konnten .

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

Versuchen Sie folgendes:

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

Einzelheiten darüber, wie ein Timedelta Objekt besser zu drucken, Sie this previous post sehen können.

2

Dies ist nicht in die gleiche Richtung wie die anderen Antworten, aber es könnte hilfreich sein für jemanden, der etwas menschlicher lesbarer (und weniger präzise) anzeigen möchte. Ich habe das schnell gemacht, daher sind Anregungen willkommen.

(Beachten Sie, dass sie annimmt until_seconds der späteren Zeitstempel ist.)

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' 
Verwandte Themen