我想用一种方法在Python中显示日期项目的自然时间.类似于Twitter将如何显示"片刻之前","几分钟前","两小时前","三天前"等消息.
Django 1.0在django.contrib中有一个"humanize"方法.我没有使用Django框架,即使我是,它比我想要的更有限.
请让我(以及几代未来的搜索者)知道是否已经有一个好的工作解决方案.由于这是一个很常见的任务,我想必须有一些东西.
具体的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)
虽然在这个时刻对你没用,但对于未来的搜索者来说可能是这样的: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'
这是直接从关于时间增量格式的babel文档中获取的.这至少可以帮助你完成部分工作.它不会模糊到"片刻之前"这样的水平,但它会做"n分钟"等正确复数.
对于它的价值,babel模块还包含根据区域设置格式化日期和时间的功能,这在时间增量很大时可能很有用.
有人性化的包装:
>>> 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'
进一步(见上面的链接)它还支持人性化:
整数
文件大小
浮点数(到小数)
或者你可以很容易地从Django 调整timesince.py,它只有2个其他的依赖关系:一个用于翻译(你可能不需要)和一个用于时区(可以很容易地适应).
顺便说一句,Django有一个非常灵活的BSD许可证,你可以在你目前正在使用的任何项目中使用它.
你在寻找这样的东西(用Python打印相对日期)吗?