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