我知道以前有人问过这个问题,我仍在努力解决这个问题。我已经尝试过 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/