Python中的自然/相对天数

问题描述 投票:35回答:6

我想用一种方法来显示Python中标有日期的项目的自然时间。类似于Twitter如何显示“片刻前”,“几分钟前”,“两个小时前”,“三天前”等消息。

Django 1.0在django.contrib中具有“人性化”方法。我没有使用Django框架,即使我使用了它,也比我想要的要受限制。

[请让我(以及以后的搜索者)知道是否已经有了一个好的解决方案。由于这是一项足够常见的任务,因此我想一定有一些东西。

python datetime human-readable datetime-parsing humanize
6个回答
17
投票
虽然目前对您没有用,但对于将来的搜索者可能是这样:babel模块处理各种语言环境内容,具有一项功能,可用于或多或少地执行您想要的操作。目前,它只是在他们的后备箱中,而不是在最新的公共发行版(0.9.4版)中。一旦功能发布,您可以执行以下操作:

from datetime import timedelta from babel.dates import format_timedelta delta = timedelta(days=6) format_timedelta(delta, locale='en_US') u'1 week'

直接从the babel documentation on time delta formatting中获取。这至少会让您有所作为。它不会将模糊性降低到“片刻之前”的水平,但会正确地复数“ n分钟”等。

就其价值而言,babel模块还包含用于根据语言环境格式化日期和时间的函数,当时间增量较大时,这可能会很有用。


38
投票
Twitter日期特别有趣,因为它们仅在第一天是相对的。 24小时后,他们只显示月份和日期。一年后,他们开始显示一年的最后两位数字。这是一个示例函数,其功能类似于Twitter的相对日期,尽管它始终会在24小时后显示年份。它仅是美国语言环境,但是您始终可以根据需要进行更改。

# tested in Python 2.7 import datetime def prettydate(d): diff = datetime.datetime.utcnow() - d s = diff.seconds if diff.days > 7 or diff.days < 0: return d.strftime('%d %b %y') elif diff.days == 1: return '1 day ago' elif diff.days > 1: return '{} days ago'.format(diff.days) elif s <= 1: return 'just now' elif s < 60: return '{} seconds ago'.format(s) elif s < 120: return '1 minute ago' elif s < 3600: return '{} minutes ago'.format(s/60) elif s < 7200: return '1 hour ago' else: return '{} hours ago'.format(s/3600)


11
投票
the humanize package

>>> import humanize >>> import datetime >>> humanize.naturalday(datetime.datetime.now()) 'today' >>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1)) 'yesterday' >>> humanize.naturalday(datetime.date(2007, 6, 5)) 'Jun 05' >>> humanize.naturaldate(datetime.date(2007, 6, 5)) 'Jun 05 2007' >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1)) 'a second ago' >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600)) 'an hour ago'

您的用例示例:

>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=36000)) '10 hours ago' >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=360000)) '4 days ago' >>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600000)) 'a month ago'

进一步(请参见上面的链接),它还支持以下方面的人性化:

    整数
  • 文件大小
  • 浮点数(至小数)

8
投票
或者您可以轻松地将Django的timesince.py改编为自身只有2个其他依赖项:一个用于翻译(您可能不需要),另一个用于时区(可以轻松改编)。

顺便说一下,Django has a BSD license非常灵活,您将可以在当前正在使用的任何项目中使用它。


5
投票
您是否正在寻找something like this(在Python中打印相对日期)?

0
投票
发现obe可以这样使用maya

pip install maya >>> maya.when("3 week ago").datetime().strftime("%Y-%m-%d") '2020-04-27'

© www.soinside.com 2019 - 2024. All rights reserved.