Python中的自然/相对日子

我想要一种方式来显示Python的date项目的自然时间。 类似于Twitter将如何显示来自“刚才”,“几分钟前”,“两个小时前”,“三天前”等的消息。

Django 1.0在django.contrib中有一个“人性化”的方法。 我没有使用Django框架,即使是我,也比我想要的更有限。

请让我(和几代未来的search者)知道是否已经有一个好的工作解决scheme。 既然这是一个常见的任务,我想一定有什么东西。

虽然在这个时候对你没什么用处,但是对于未来的search者来说可能是这样的:处理各种区域设置的babel模块具有多less做你想要的function。 目前它只是在它们的主干中,而不是在最新的公开发行(版本0.9.4)。 一旦function登陆发布,你可以做一些事情:

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

这是直接从时间增量格式的巴贝尔文档 。 这将至less让你的一部分。 它不会模糊到“不久前”的水平,但它会做“n分钟”等正确的复数。

对于它的价值,babel模块还包含根据区域设置来格式化date和时间的函数,这在时间增量很大时可能是有用的。

特定的Twitterdate是有趣的,因为它们只是第一天的相对。 24小时后,他们只显示月份和date。 一年后,他们开始显示今年的最后两位数字。 下面是一个示例函数,它可以做更类似于Twitter相对date的事情,尽pipe它在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) 

或者你可以很容易地从Django中调用timesince.py ,这个Django只有2个其他的依赖关系:一个用于翻译(你可能不需要),另一个用于时区(可以很容易地调整)。

顺便说一下, Django有一个非常灵活的BSD许可证 ,你可以在任何你正在使用的项目中使用它。

有人性化的套餐 :

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

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

  • 整数
  • 文件大小
  • 浮动(分数)

你在找这样的东西 (在Python中打印相对date)?