Python中如何实现友好的时间格式?

84 投票
16 回答
42887 浏览
提问于 2025-04-15 15:00

Python:我想要显示文件的修改时间,格式是“1天前”、“两个小时前”这样的。

有没有现成的工具可以做到这一点?最好是用英语显示。

16 个回答

16

我在寻找同样的东西时,还希望它能处理未来的日期,结果找到了这个: http://pypi.python.org/pypi/py-pretty/1

这里有个示例代码(来自网站):

from datetime import datetime, timedelta
now = datetime.now()
hrago = now - timedelta(hours=1)
yesterday = now - timedelta(days=1)
tomorrow = now + timedelta(days=1)
dayafter = now + timedelta(days=2)

import pretty
print pretty.date(now)                      # 'now'
print pretty.date(hrago)                    # 'an hour ago'
print pretty.date(hrago, short=True)        # '1h ago'
print pretty.date(hrago, asdays=True)       # 'today'
print pretty.date(yesterday, short=True)    # 'yest'
print pretty.date(tomorrow)                 # 'tomorrow'
33

如果你正在使用Django,那么在1.4版本中新增了一个叫做naturaltime的模板过滤器。

要使用这个过滤器,首先需要在你的settings.py文件中的INSTALLED_APPS设置里添加'django.contrib.humanize',然后在你使用这个过滤器的模板中加入{% load humanize %}

接着,在你的模板里,如果你有一个日期时间变量my_date,你可以通过{{ my_date|naturaltime }}来显示它与现在的时间差,比如会显示成4 minutes ago(4分钟前)。

Django 1.4中的其他新功能。

关于naturaltime和其他django.contrib.humanize过滤器的文档。

142

这段代码最初是在一个博客文章“Python 美观日期函数”上发布的,链接是http://evaisse.com/post/93417709/python-pretty-date-function

这里重新发布是因为那个博客账号已经被停用,页面也找不到了。

def pretty_date(time=False):
    """
    Get a datetime object or a int() Epoch timestamp and return a
    pretty string like 'an hour ago', 'Yesterday', '3 months ago',
    'just now', etc
    """
    from datetime import datetime
    now = datetime.now()
    if type(time) is int:
        diff = now - datetime.fromtimestamp(time)
    elif isinstance(time, datetime):
        diff = now - time
    elif not time:
        diff = 0
    second_diff = diff.seconds
    day_diff = diff.days

    if day_diff < 0:
        return ''

    if day_diff == 0:
        if second_diff < 10:
            return "just now"
        if second_diff < 60:
            return str(second_diff) + " seconds ago"
        if second_diff < 120:
            return "a minute ago"
        if second_diff < 3600:
            return str(second_diff // 60) + " minutes ago"
        if second_diff < 7200:
            return "an hour ago"
        if second_diff < 86400:
            return str(second_diff // 3600) + " hours ago"
    if day_diff == 1:
        return "Yesterday"
    if day_diff < 7:
        return str(day_diff) + " days ago"
    if day_diff < 31:
        return str(day_diff // 7) + " weeks ago"
    if day_diff < 365:
        return str(day_diff // 30) + " months ago"
    return str(day_diff // 365) + " years ago"

撰写回答