Python可读的日期差异

13

我有以下这些日期字符串:

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

用Python计算天数的简便方法是什么?假设时区相同。

这些字符串是由Linux命令返回的。

编辑:谢谢,有很多好的答案。


这看起来非常像 https://stackoverflow.com/questions/13958844/human-readable-datetime-interval-to-datetime-timedelta-in-python/53231775 和 https://dev59.com/6HRB5IYBdhLWcg3wuZQ1,它们也有有趣的答案。 - anarcat
7个回答

7

使用 strptime 函数。

示例用法:

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

编辑:

你也可以将时间差以易于理解的形式打印出来,像这样:

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)

这里是时间代码片段的原始来源。


6
#!/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
>>> 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

这是其他答案中使用的代码片段。 - qneill
是的,就我所知,我的答案比其他人(或包含那些片段的编辑)更早。并不是说这是一个非常有创意的答案,你只需要阅读文档即可... - Tim Pietzcker

3

这个回答与其他回答不太相同,但对于想要显示更易读(且不太精确)的内容可能会有帮助。我很快就完成了这个任务,所以欢迎提出建议。

(请注意,它假定until_seconds是较晚的时间戳。)

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'

1

以下是@the_void改进的date_diff()函数的版本。根据时间差的大小,它将以以下方式打印差异:

1d 
12 sec
30 min 12 sec
3h 30m 
5d 3h 30m 

这是常规操作:

def date_diff(newer, older):
    if newer < older:
        return '-1'

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

    str = ""
    tStr = ""
    if days > 0:
        tStr = "d"
        str = str + "%s%s " %(days, tStr)        

    if hours > 0:
        tStr = "h"
        str = str + "%s%s " %(hours, tStr)
        
    if minutes > 0:
        if days == 0 and hours == 0:
            tStr = 'min'
            str = str + "%s %s " %(minutes, tStr)
        else:
            tStr = "m"
            str = str + "%s%s " %(minutes, tStr)
        
    if days == 0 and hours == 0:    
        if seconds >= 0:
            if days == 0 and hours == 0:
                tStr = "sec"               
                
                str = str + "%s %s" %(seconds, tStr)
            else:
                tStr = 's'
                str = str + "%s%s" %(seconds, tStr)
    
    return str

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)

关于如何更好地打印timedelta对象的详细信息,您可以查看这篇先前的帖子


0

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接