2011-01-28 41 views

Trả lời

246

Có hai cách để thực hiện. Cách tiếp cận trực tiếp sẽ được chỉ cần gọi (và in) phương pháp strftime() trong mẫu của bạn, ví dụ

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

khác, cách tiếp cận trông dể thương tốt hơn sẽ được xác định bộ lọc riêng của bạn, ví dụ:

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 

(Bộ lọc này dựa trên babel vì các lý do liên quan đến i18n, nhưng bạn cũng có thể sử dụng strftime). Ưu điểm của bộ lọc là bạn có thể viết

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

trông đẹp hơn và dễ bảo trì hơn. Một bộ lọc phổ biến khác cũng là bộ lọc "timedelta", bộ lọc này đánh giá một thứ gì đó như "viết cách đây 8 phút". Bạn có thể sử dụng babel.dates.format_timedelta cho điều đó và đăng ký nó làm bộ lọc tương tự như ví dụ về ngày giờ được đưa ra ở đây.

+0

đã bạn thực sự cố gắng đó? gọi nó trực tiếp dẫn đến: 'thời gian.struct_time object 'không có thuộc tính' strftime ' –

+6

Theo câu hỏi của bạn, bạn đang nói về một cái gì đó khác nhau. Ban đầu, chủ đề này đã định dạng một đối tượng 'datetime' từ mô-đun python' datetime', nhưng bạn đang cố định dạng một đối tượng 'struct_time' từ mô-đun' time' ở mức thấp. Các đối tượng 'struct_time' không có phương thức' strftime() ', mặc dù có thể có phương thức' strftime() 'toàn cục trong gói thời gian. Nhưng tôi khuyên bạn nên sử dụng gói 'datetime' cấp cao (nền độc lập) thay thế. – tux21b

+0

Đúng, tôi đã sử dụng time.time(), và bây giờ nên xem xét liệu tôi có thực sự muốn điều đó hay datetime.datetime.today() Cảm ơn –

18

Dưới đây là các bộ lọc mà tôi đã kết thúc sử dụng cho strftime trong Jinja2 và Flask

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

Và sau đó bạn sử dụng bộ lọc như vậy:

người dùng
{{car.date_of_manufacture|strftime}} 
+1

Tại sao 'dateutil' và' native'? – gwg

12

Nếu bạn đang đối phó với một đối tượng thời gian cấp thấp hơn (Tôi thường chỉ cần sử dụng số nguyên), và không muốn viết một bộ lọc tùy chỉnh cho bất cứ lý do, một cách tiếp cận Tôi sử dụng là để vượt qua các strftime chức năng vào mẫu như là một biến, nơi nó có thể được gọi là nơi bạn cần nó.

Ví dụ:

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

nào sau đó có thể được sử dụng trong 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

trong bình, với babel, tôi muốn làm điều này:

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

sử dụng trong mẫu với {{mydatetimeobject|dt}}

vì vậy không có babel bạn có thể chỉ định dạng khác nhau của bạn trong messages.po như thế này ví dụ:

#: app/views.py:36 
#, python-format 
msgid "%%m/%%d/%%Y" 
msgstr "%%d/%%m/%%Y" 
Các vấn đề liên quan