使用strftim时,Jinja2模板中的“TypeError:必须是字符串,而不是datetime.datetime”

2024-09-25 00:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试格式化Flask应用程序中使用datetime.datetime.utcnow()生成的日期(使用这个,因为它相当于我的应用程序使用的数据库MongoDB中的ISODate()),但是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')

日期如下:

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

我有以下过滤器:

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

但当我试图在模板中格式化时间戳时:

{{ change.submit_date|isodateformat }}

我得到这个错误:

"TypeError: must be string, not datetime.datetime"

我不明白为什么我会犯这个错误。strftime()不将日期转换为字符串吗?


Tags: 数据库应用程序formatjinja2flaskdatetimedatemongodb
1条回答
网友
1楼 · 发布于 2024-09-25 00:35:41

问题是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()})

字符串的第一次打印成功,但第二次打印失败,TypeError: must be string, not datetime.datetime

相关问题 更多 >