我知道以前有人问过这个问题,我仍在努力解决这个问题。我已经尝试过 pytz、dateutil 和现在的flask_moment。在将 MySQL 表日期时间(UTC)转换为在 jinja2 模板中显示为本地时间时仍然存在问题,特别是 UTC - 05:00 (EST)。

我的 jinja2 for 循环如下所示:

{% for data in items %}
    ...
   <td>{{data.loggedInBy}}</td>
   <td>{{data.timeIn.strftime('%I:%M %p')}}</td>
    ...
{% endfor %}

我是 python/flask/jinja 的新手,所以请放轻松。对于像我这样的菜鸟来说,文档非常困惑。有人可以指导我让我的 MySQL 表显示本地时区的时间吗?

我觉得这很接近,但会出错。在 init .py 中,我有:
from pytz import timezone

def datetimefilter(value, format='%I:%M %p'):
    tz = timezone('US/Eastern')
    dt = value
    local_dt = tz.localize(dt)
    local_dt.replace(hour=local_dt.hour + int(local_dt.utcoffset().total_seconds() / 3600))
    return local_dt.strftime(format)

flask_app.jinja_env.filters['datetimefilter'] = datetimefilter

jinja template had:

{% for data in items %}
...
<td>{{data.loggedInBy}}</td>
<td>{{data.timeIn | datetimefilter }}</td>
...
{% endfor %}

但这给了我“ValueError:小时必须在0..23”
从行:
local_dt.replace(hour=local_dt.hour + int(local_dt.utcoffset().total_seconds() / 3600))

提前致谢!

最佳答案

这就是最终对我有用的东西,在这种特殊情况下,我仍然不确定它是否会在 DST 期间提供不正确的信息,但我们会看到。

import pytz
from pytz import timezone
import tzlocal

def datetimefilter(value, format="%I:%M %p"):
    tz = pytz.timezone('US/Eastern') # timezone you want to convert to from UTC
    utc = pytz.timezone('UTC')
    value = utc.localize(value, is_dst=None).astimezone(pytz.utc)
    local_dt = value.astimezone(tz)
    return local_dt.strftime(format)

flask_app.jinja_env.filters['datetimefilter'] = datetimefilter

然后我的 jinja2 模板看起来像:
{% for data in items %}
...
<td>{{data.loggedInBy}}</td>
<td>{{data.timeIn | datetimefilter }}</td>
...
{% endfor %}

如果有任何改进方法,我愿意接受建议,但到目前为止,这是我发现有效的唯一方法。

关于python - 在flask/jinja模板中将UTC转换为本地时区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34803906/

10-09 03:26