我想将python timedelta对象格式化为“x分钟/小时/周/月/年前”。
我知道有一些类似的问题,例如:
但是,我没有找到我的案例的答案,因为
timedelta
格式化为字符串,而不是相反这是我目前的代码(摘录,抱歉):
delta = babel.dates.format_timedelta(now - dt, format=format,
locale=locale)
if now > dt:
return _(u"%(timedelta)s ago") % {'timedelta': delta}
else:
return _(u"in %(timedelta)s") % {'timedelta': delta}
有关babel
功能,请参阅http://babel.pocoo.org/docs/dates/#time-delta-formatting
现在这在英语中运行良好。然而,在德语中,它失败了:
上述代码会将"2 years ago"
翻译为"vor 2 Jahre"
而不是"vor 2 Jahren"
。
我也很满意不使用"... ago"
措辞的解决方案。只要它是相似的和可翻译的,我就可以接受它。
答案 0 :(得分:2)
这是一个快速的例子,可以让你走上正确的轨道:
>>> import datetime
>>> delta = datetime.timedelta(days=2)
>>> delta.days
2
>>> print delta
2 days, 0:00:00
你应该在合理的情况下创建你的格式,或许其他人可以在这里开箱即用答案。
>>> '{0} ago'.format(delta)
'2 days, 0:00:00 ago'
def total_hours(a_timedelta):
return a_timedelta.total_seconds()/60.0/60.0
用法:
>>> total_hours(delta)
48.0
>>> '{0} hours ago'.format(total_hours(delta))
'48.0 hours ago'
>>> then = datetime.datetime.now()
>>> diff = datetime.datetime.now() - then
>>> diff
datetime.timedelta(0, 12, 967773)
>>> '{0} hours ago'.format(total_hours(diff))
'0.00360215916667 hours ago'
答案 1 :(得分:2)
根据我发现here的文档,您应该在add_direction=True
来电中添加format_timedelta
参数。
答案 2 :(得分:1)
您可能要使用arrow软件包,尤其是人性化功能:
import arrow
a = arrow.now()
print a.humanize()
输出:“现在”
为您的需要,假设您有一个类似的日期:
myDate = "2019-02-10 08:00:00"
a = arrow.get(myDate, "YYYY-DD-MM HH:mm:ss")
print a.humanize()
输出:“一个小时前”
您可以在此处找到文档:https://arrow.readthedocs.io/en/latest/