2011-01-28 19 views

Respuesta

246

Hay dos maneras de hacerlo. El enfoque directo sería simplemente llamar a (e imprimir) el método de strftime() en su plantilla, por ejemplo

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

Otro, un poquitito mejor enfoque sería definir su propio filtro, por ejemplo:

from flask import Flask 
import babel 

app = Flask(__name__) 

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) 

app.jinja_env.filters['datetime'] = format_datetime 

(Este filtro está basado en babel por razones relacionadas con i18n, pero también puede usar strftime). La ventaja del filtro es que puede escribir

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

que se ve mejor y es más fácil de mantener. Otro filtro común es también el filtro "timedelta", que evalúa algo así como "escrito hace 8 minutos". Puede usar babel.dates.format_timedelta para eso y registrarlo como un filtro similar al ejemplo de fecha y hora proporcionado aquí.

+0

¿Realmente tratar eso? llamarlo directamente da como resultado: 'tiempo'.struct_time object 'no tiene atributo' strftime ' –

+6

Según su pregunta, usted está hablando de algo diferente. Inicialmente, este hilo trata sobre formatear un objeto 'datetime' del módulo python' datetime', pero está tratando de formatear un objeto 'struct_time' del módulo' time' de bajo nivel. Los objetos 'struct_time' no tienen un método' strftime() ', aunque podría haber un método global' strftime() 'en el paquete de tiempo. Pero le recomiendo que use el paquete de alto nivel (independiente de la plataforma) 'datetime' en su lugar. – tux21b

+0

Correcto, he estado usando time.time(), y ahora debería considerar si realmente quiero eso, o datetime.datetime.today() Gracias –

18

Aquí está el filtro que terminé usando para strftime en Jinja2 y Frasco

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

a continuación, utiliza el filtro de este modo:

usuarios
{{car.date_of_manufacture|strftime}} 
+1

¿Por qué 'dateutil' y' native'? – gwg

12

Si se trata de un objeto de tiempo de nivel inferior (a menudo sólo tiene que utilizar números enteros), y no desea escribir un filtro personalizado por cualquier razón, un enfoque Lo que uso es pasar la función strftime a la plantilla como una variable, donde se puede llamar donde lo necesite.

Por ejemplo:

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

que luego puede ser utilizado dentro de 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> 
0

en el matraz, con Babel, me gusta hacer esto:

@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')) 

utilizarse en la plantilla con {{mydatetimeobject|dt}}

por lo que no con Babel puede especificar sus diferentes formatos en messages.po así por ejemplo:

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