Как включить часовые пояса с помощью babel в моем фильтре jinja?

Я хочу использовать часовые пояса в соответствии с локалью babel. Как я могу этого добиться? Конкретная ситуация, с которой я сталкиваюсь, заключается в отображении даты и времени статьи, а также в гуманизированном и локализованном виде, например:

Вчерашний день

13:21

или если параметр шведского языка установлен, он будет отображать

Igår

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)

Приведенный выше код локализует и гуманизирует вывод:

введите здесь описание изображения

Я также могу переключать языки, например, на бразильский португальский:

введите здесь описание изображения

Где Hoje имеет в виду сегодня, поэтому фильтр работает.

Не могли бы вы рассказать мне, как я могу включить свой код, чтобы также разрешать часовые пояса? Я использую Babel для локализации и Jinja2 для рендеринга. Должен ли часовой пояс быть часовым поясом статьи или часовым поясом зрителя? Например, бразильский пользователь в Бразилии отправляет сообщение, а шведский зритель в Швеции просматривает сообщение. Какой часовой пояс следует использовать?

Я могу попытаться обработать часовые пояса, импортировав библиотеку pytz, как указано в документации, и используя объект часового пояса I. Я могу передать параметр часового пояса через код шаблона, но как узнать параметр часового пояса из статьи или из локали? В этом случае локаль и часовой пояс будут другими, так как это для Индии, а локаль — английский, а часовой пояс — Индия:

{{ article.modified|datetimeformat_jinja(locale='en') }}

Затем я также могу передать параметр часового пояса, подобный этому

{{ 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)

Так что, по крайней мере, кажется, что я могу локализовать один часовой пояс, но мне интересно, как сделать его динамичным.


person Niklas R.    schedule 25.12.2011    source источник
comment
Чтобы получить локализованные имена на основе номера месяца, вы можете использовать: calendar.month_abbr[<month_number>].   -  person jcollado    schedule 27.12.2011


Ответы (1)


Должен ли часовой пояс быть часовым поясом статьи или часовым поясом зрителя? Например, бразильский пользователь в Бразилии отправляет сообщение, а шведский зритель в Швеции просматривает сообщение. Какой часовой пояс следует использовать?

Я всегда буду отображать время как «время настенных часов», что означает использование часового пояса, который ваш зритель увидит на обычных часах на своем столе. Однако это зависит от вас.

Я могу передать параметр часового пояса через код шаблона, но как узнать параметр часового пояса из статьи или из локали? В этом случае локаль и часовой пояс будут другими, так как это для Индии, а локаль — английский, а часовой пояс — Индия:

Ужасная правда заключается в том, что часовые пояса и локали — это два разных зверя, между которыми очень слабая связь. Например, индиец в Швеции по-прежнему хочет читать по-английски (хинди, ...), но в шведском часовом поясе.

Конечно, вы можете жестко закодировать его для конкретных целей, но более разумным было бы отделить локаль от часового пояса и позволить пользователю управлять настройкой часового пояса.

Что касается вашего кода, вам, вероятно, нужно переключиться с наивного времени на дату и время с поддержкой tz.

person Felix Schwarz    schedule 03.08.2012