2

Flask アプリケーションで生成された日付をフォーマットしようとしています(アプリが使用するデータベースである MongoDB とdatetime.datetime.utcnow()同等であるため、これを使用します) が、Jinja2 はそれらをレンダリングしません。ISODate()

アプリに次の機能があります。

def format_isodate(timestamp):
    """Format a ISODate time stamp for display."""
    date = datetime.datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S.%f")
    return date.strftime('%Y-%m-%d @ %H:%M:%S')

日付は次のようになります。

"2013-07-04 20:06:05.088000"

そして、私は次のフィルターを持っています:

app.jinja_env.filters['isodateformat'] = format_isodate

しかし、テンプレートでタイムスタンプをフォーマットしようとすると:

{{ change.submit_date|isodateformat }}

次のエラーが表示されます。

「TypeError: datetime.datetime ではなく文字列である必要があります」

このエラーが発生する理由がわかりません。strftime()日付を文字列に変換しませんか?

4

1 に答える 1

4

問題は、文字列ではなくオブジェクトをutcnow()返すことです。datetime.datetime例外の行番号を確認すると、strptime呼び出しが失敗している可能性があります。文字列を日付に解析することはできますが、日付を解析することはできません。

例:

#!/usr/bin/env python2.7

import datetime

import jinja2

def format_isodate(timestamp):
    """Format a ISODate time stamp for display."""
    date = datetime.datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S.%f")
    return date.strftime('%Y-%m-%d @ %H:%M:%S')

e = jinja2.Environment()
e.filters['isodateformat'] = format_isodate

t = e.from_string('{{ change.submit_date|isodateformat }}')
print t.render(change={'submit_date': "2013-07-04 20:06:05.088000"})
print t.render(change={'submit_date': datetime.datetime.now()})

文字列の最初の出力は成功しますが、2 番目の出力は で失敗しTypeError: must be string, not datetime.datetimeます。

于 2013-07-04T21:50:29.710 に答える