如何在python中格式化像“1小时前”的timedelta,以便它可以翻译

时间:2014-01-30 16:27:12

标签: python datetime internationalization

我想将python timedelta对象格式化为“x分钟/小时/周/月/年前”。

我知道有一些类似的问题,例如:

但是,我没有找到我的案例的答案,因为

  • 我不使用django
  • 我需要将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"措辞的解决方案。只要它是相似的和可翻译的,我就可以接受它。

3 个答案:

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

timedelta对象的函数

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/