【问题标题】:How do I format a date in Jinja2?如何在 Jinja2 中格式化日期?
【发布时间】:2011-06-17 08:42:16
【问题描述】:

使用 Jinja2,我如何格式化日期字段?我知道在 Python 中我可以简单地做到这一点:

print(car.date_of_manufacture.strftime('%Y-%m-%d'))

但是如何在 Jinja2 中格式化日期?

【问题讨论】:

    标签: python jinja2


    【解决方案1】:

    我认为您必须为此编写自己的过滤器。它实际上是文档中自定义过滤器的示例:http://jinja.pocoo.org/docs/api/#custom-filters

    【讨论】:

      【解决方案2】:

      有两种方法可以做到这一点。直接的方法是简单地调用(并打印)模板中的 strftime() 方法,例如

      {{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
      

      另一种更好的方法是定义自己的过滤器,例如:

      from flask import Flask
      import babel
      
      app = Flask(__name__)
      
      @app.template_filter()
      def format_datetime(value, format='medium'):
          if format == 'full':
              format="EEEE, d. MMMM y 'at' HH:mm"
          elif format == 'medium':
              format="EE dd.MM.y HH:mm"
          return babel.dates.format_datetime(value, format)
          
      

      (由于 i18n 的原因,此过滤器基于 babel,但您也可以使用 strftime)。过滤器的优点是,你可以写

      {{ car.date_of_manufacture|format_datetime }}
      {{ car.date_of_manufacture|format_datetime('full') }}
      

      看起来更好,更易于维护。另一个常见的过滤器也是“timedelta”过滤器,它的计算结果类似于“8 分钟前写的”。您可以为此使用babel.dates.format_timedelta,并将其注册为类似于此处给出的日期时间示例的过滤器。

      【讨论】:

      • 你真的尝试过吗?直接调用它会导致:'time.struct_time object' has no attribute 'strftime'
      • 根据您的问题,您在谈论不同的东西。最初,该线程是关于从 python 模块 datetime 格式化 datetime 对象,但您正在尝试从低级 time 模块格式化 struct_time 对象。 struct_time 对象没有strftime() 方法,尽管时间包中可能有一个全局strftime() 方法。但我建议您改用高级(独立于平台)datetime 包。
      • 我想你的意思是babel.dates.format_datetime(value, format)
      • 定义一个新的过滤器,无论如何都不是更好。更多代码要编写 = 更多代码要维护 = 更多代码要解析、位缓存(如果使用)和解释。使用 Jinja2 的一大优势是能够在模板中编写小的 Python 代码。与 Django 的模板系统相比,一些性能提升来自于此。
      • @StefanNch “定义一个新的过滤器,无论如何都不是更好”。可以是:如果在模板中多次调用过滤器,这样可以避免重复格式字符串,并且可以减少编写代码。更重要的是,通过添加抽象来减少重复代码。
      【解决方案3】:

      这是我最终在 Jinja2 和 Flask 中用于 strftime 的过滤器

      @app.template_filter('strftime')
      def _jinja2_filter_datetime(date, fmt=None):
          date = dateutil.parser.parse(date)
          native = date.replace(tzinfo=None)
          format='%b %d, %Y'
          return native.strftime(format) 
      

      然后你像这样使用过滤器:

      {{car.date_of_manufacture|strftime}}
      

      【讨论】:

      • 为什么是dateutilnative
      【解决方案4】:

      Google App Engine 用户:如果您要从 Django 迁移到 Jinja2,并希望替换日期过滤器,请注意 % 格式代码不同。

      strftime % 代码在这里:http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior

      【讨论】:

        【解决方案5】:

        如果您正在处理较低级别的时间对象(我通常只使用整数),并且出于某种原因不想编写自定义过滤器,我使用的一种方法是将 strftime 函数作为变量,可以在需要的地方调用。

        例如:

        import time
        context={
            'now':int(time.time()),
            'strftime':time.strftime }  # Note there are no brackets () after strftime
                                        # This means we are passing in a function, 
                                        # not the result of a function.
        
        self.response.write(jinja2.render_template('sometemplate.html', **context))
        

        然后可以在sometemplate.html中使用:

        <html>
            <body>
                <p>The time is {{ strftime('%H:%M%:%S',now) }}, and 5 seconds ago it was {{ strftime('%H:%M%:%S',now-5) }}.
            </body>
        </html>
        

        【讨论】:

          【解决方案6】:

          在烧瓶中,使用 babel,我喜欢这样做:

          @app.template_filter('dt')
          def _jinja2_filter_datetime(date, fmt=None):
              if fmt:
                  return date.strftime(fmt)
              else:
                  return date.strftime(gettext('%%m/%%d/%%Y'))
          

          在模板中使用{{mydatetimeobject|dt}}

          所以不使用 babel,您可以在 messages.po 中指定各种格式,例如:

          #: app/views.py:36
          #, python-format
          msgid "%%m/%%d/%%Y"
          msgstr "%%d/%%m/%%Y"
          

          【讨论】:

            【解决方案7】:

            你可以在没有任何过滤器的模板中这样使用它

            {{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
            

            【讨论】:

              【解决方案8】:

              您可以使用 jinja2 扩展,只需 pip install (https://github.com/hackebrot/jinja2-time)

              【讨论】:

                【解决方案9】:

                你可以在 jinja 模板中这样使用它 {{ row.session_start_date_time.strftime('%d-%m-%Y %H:%M:%S')}}

                在此代码中,字段名称为row.session_start_date_time

                【讨论】:

                  【解决方案10】:

                  成功了。

                  from datetime import datetime
                  dateNow = datetime.now().strftime('%Y%m%d')
                  

                  【讨论】:

                    【解决方案11】:

                    我使用这个过滤器,它是西班牙语,但您可以根据需要更改名称。

                    @app.template_filter('datetime')
                    def date_format(value):
                        months = ('Enero','Febrero',"Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre")
                        month = months[value.month-1]
                        hora = str(value.hour).zfill(2)
                        minutos = str(value.minute).zfill(2)
                        return "{} de {} del {} a las {}:{}hs".format(value.day, month, value.year, hora, minutos)
                    

                    【讨论】:

                    • 您也可以使用这个库:pypi.org/project/timeago 它的格式为“2 分钟前”,并且在许多语言中都类似
                    猜你喜欢
                    • 2021-05-02
                    • 2020-07-11
                    • 2020-10-20
                    • 2011-01-31
                    • 2014-04-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多