Python 如何在我的jinja过滤器中使用babel启用时区?

Python 如何在我的jinja过滤器中使用babel启用时区?,python,timezone,internationalization,jinja2,python-babel,Python,Timezone,Internationalization,Jinja2,Python Babel,我想根据巴贝尔地区使用时区。我怎样才能做到这一点?我的具体情况是以人性化和本地化的方式显示文章的日期和时间,例如: 昨天 13:21 或者,如果设置了瑞典语参数,将显示 伊戈尔 13:21 如果日期不是昨天或今天,它将打印日期和24小时时间。我想除了处理时区外,我在所有方面都取得了成功: from webapp2_extras import i18n from webapp2_extras.i18n import lazy_gettext as _ import date

我想根据巴贝尔地区使用时区。我怎样才能做到这一点?我的具体情况是以人性化和本地化的方式显示文章的日期和时间,例如:

昨天

13:21

或者,如果设置了瑞典语参数,将显示

伊戈尔

13:21

如果日期不是昨天或今天,它将打印日期和24小时时间。我想除了处理时区外,我在所有方面都取得了成功:

    from webapp2_extras import i18n
    from webapp2_extras.i18n import lazy_gettext as _
    import datetime
    from datetime import date, datetime, time
    from babel.dates import format_date, format_datetime, format_time
    from babel.numbers import format_number, format_decimal, format_percent
    def datetimeformat_jinja(value, format='%H:%M / %d-%m-%Y', locale='en'):
        now= datetime.now()
        info = None
        if datetime.date(value) == datetime.date(now):
          info= _('Today')
        elif (now - value).days < 2:
          info= _('Yesterday')
        else:
          month = value.month
          if month == 1:
            info = str(value.day)+' '+_('Jan')
          elif month == 2:
            info = str(value.day)+' '+_('Feb')
          elif month == 3:
            info = str(value.day)+' '+_('Mar')
          elif month == 4:
            info = str(value.day)+' '+_('April')
          elif month == 5:
            info = str(value.day)+' '+_('May')
          elif month == 6:
            info = str(value.day)+' '+_('June')
          elif month == 7:
            info = str(value.day)+' '+_('July')
          elif month == 8:
            info = str(value.day)+' '+_('Aug')
          elif month == 9:
            info = str(value.day)+' '+_('Sep')
          elif month == 10:
            info = str(value.day)+' '+_('Oct')
          elif month == 11:
            info = str(value.day)+' '+_('Nov')
          else:
            info = str(value.day)+' '+_('Dec')
        return info+'<br>'+format_time(value, 'H:mm', locale=locale)
然后我也可以像这样传递I时区参数

{{ article.modified|datetimeformat_jinja(locale='en') }}
过滤器:

def datetimeformat_jinja(value, format='%H:%M / %d-%m-%Y', locale='en', tzinfo=timezone('India')):
    now= datetime.now()
    info = None
    if datetime.date(value) == datetime.date(now):
      info= _('Today')
    elif (now - value).days < 2:
      info= _('Yesterday')
    else:
      month = value.month
      if month == 1:
        info = str(value.day)+' '+_('Jan')
      elif month == 2:
        info = str(value.day)+' '+_('Feb')
      elif month == 3:
        info = str(value.day)+' '+_('Mar')
      elif month == 4:
        info = str(value.day)+' '+_('April')
      elif month == 5:
        info = str(value.day)+' '+_('May')
      elif month == 6:
        info = str(value.day)+' '+_('June')
      elif month == 7:
        info = str(value.day)+' '+_('July')
      elif month == 8:
        info = str(value.day)+' '+_('Aug')
      elif month == 9:
        info = str(value.day)+' '+_('Sep')
      elif month == 10:
        info = str(value.day)+' '+_('Oct')
      elif month == 11:
        info = str(value.day)+' '+_('Nov')
      else:
        info = str(value.day)+' '+_('Dec')
    return info+'<br>'+format_time(value, 'H:mm', tzinfo=tzinfo, locale=locale)
def datetimeformat_jinja(值,格式='%H:%M/%d-%M-%Y',locale='en',tzinfo=时区('India'):
now=datetime.now()
信息=无
如果datetime.date(值)=datetime.date(现在):
信息=(今天)
elif(现在-值)。天数<2:
信息=(昨天)
其他:
月=value.month
如果月份==1:
info=str(value.day)+''+.'Jan')
elif月==2:
info=str(value.day)+''+.'二月')
elif月==3:
info=str(value.day)+''+.'Mar')
elif月==4:
info=str(value.day)+''+.'四月')
elif月==5:
info=str(value.day)+''+.'五月')
elif月==6:
info=str(value.day)+''+(('June'))
elif月==7:
info=str(value.day)+''+.'七月')
elif月==8:
info=str(value.day)+''+.'八月'
elif月==9:
info=str(value.day)+''+.'Sep')
elif月==10:
info=str(value.day)+''+.'十月')
elif月==11:
info=str(value.day)+''+\'Nov')
其他:
info=str(value.day)+''+.'Dec')
返回信息+'
'+格式时间(值'H:mm',tzinfo=tzinfo,locale=locale)
所以,至少我可以将一个时区本地化,但我想知道如何使其动态化

时区应该是文章的时区还是观众的时区?例如,巴西的一名巴西用户发布消息,瑞典的一名瑞典观众查看消息。那么应该使用哪个时区

我总是将时间显示为“墙上的时钟时间”,这意味着使用你的观众在他桌子上的普通时钟上看到的时区。然而,这取决于你

我可以通过模板代码传递时区参数,但是如何从文章或语言环境中知道时区参数呢?在这种情况下,区域设置和时区将不同,因为它是针对印度的,区域设置是英语和时区印度:

{{ article.modified|datetimeformat_jinja(locale='en') }}
丑陋的事实是,时区和地点是两种不同的动物,它们之间只有非常松散的联系。例如,一个在瑞典的印度人仍然想读英语(印地语,…),但是在瑞典时区

当然,您可以针对特定用途对其进行硬编码,但更明智的做法是将区域设置与时区分离,并让用户控制时区设置

至于您的代码,您可能需要从原始日期时间切换到tz感知日期时间

时区应该是文章的时区还是观众的时区?例如,巴西的一名巴西用户发布消息,瑞典的一名瑞典观众查看消息。那么应该使用哪个时区

我总是将时间显示为“墙上的时钟时间”,这意味着使用你的观众在他桌子上的普通时钟上看到的时区。然而,这取决于你

我可以通过模板代码传递时区参数,但是如何从文章或语言环境中知道时区参数呢?在这种情况下,区域设置和时区将不同,因为它是针对印度的,区域设置是英语和时区印度:

{{ article.modified|datetimeformat_jinja(locale='en') }}
丑陋的事实是,时区和地点是两种不同的动物,它们之间只有非常松散的联系。例如,一个在瑞典的印度人仍然想读英语(印地语,…),但是在瑞典时区

当然,您可以针对特定用途对其进行硬编码,但更明智的做法是将区域设置与时区分离,并让用户控制时区设置


至于您的代码,您可能需要从原始日期时间切换到tz感知日期时间。

要根据月数获取本地化名称,您可以使用:
calendar.month\u abbr[]
。要根据月数获取本地化名称,您可以使用:
calendar.month\u abbr[]