烧瓶:将UTC时间转换为用户的本地时间
Posted
技术标签:
【中文标题】烧瓶:将UTC时间转换为用户的本地时间【英文标题】:flask: convert utc time to user's local time 【发布时间】:2018-05-16 18:22:21 【问题描述】:我正在尝试在烧瓶应用程序中将 UTC 时间转换为适当的本地时间。我想知道我是否可以检测用户的时区并动态设置它。
到目前为止,这是我的代码,仅适用于 US/Pacific
时区的所有人(datetimefilter
从 this SO question 提取)
from flask import Flask, render_template_string
import datetime
import pytz
app = Flask(__name__)
@app.template_filter('datetimefilter')
def datetimefilter(value, format='%b %d %I:%M %p'):
tz = pytz.timezone('US/Pacific') # timezone you want to convert to from UTC (America/Los_Angeles)
utc = pytz.timezone('UTC')
value = utc.localize(value, is_dst=None).astimezone(pytz.utc)
local_dt = value.astimezone(tz)
return local_dt.strftime(format)
@app.route('/')
def index():
dt = datetime.datetime.utcnow()
return render_template_string(
'''
<h4>UTC --> Local Time</h4>
Datetime right now is:
<p> dt | datetimefilter (utc --> local)</p>
''',
dt=dt, now=now)
if __name__ == '__main__':
app.run(debug=True)
我想这无法在服务器端处理,因为时区将始终设置为服务器所在的任何位置?有没有办法通过更改datetimefilter
来处理这个问题?
【问题讨论】:
【参考方案1】:如果你想在网站上动态检测用户的本地时间,最简单的方法是通过 javascript Date() 对象获取浏览器的日期时间。这样,您可以显示正确的本地时间,而无需从字面意义上检测任何内容。您的 sn-p 可能如下所示:
@app.route('/')
def index():
dt = datetime.datetime.utcnow()
return render_template_string(
'''
<html><body>
<h4>UTC --> Local Time</h4>
Datetime right now is:
<p> dt | datetimefilter (utc)</p>
<p><span id="timeNow"></span> (local)</p>
<script>
var elem = document.getElementById("timeNow")
var now = new Date();
var options = month: 'short', day: '2-digit',
hour: 'numeric', minute: '2-digit' ;
elem.innerHTML = now.toLocaleString('en-us', options);
</script>
</body></html>
''',
dt=dt)
它会根据用户的当地时间呈现以下结果:
UTC --> Local Time
Datetime right now is:
Dec 02 06:20 PM (utc)
Dec 03, 4:20 PM (local)
然后,如果您需要根据用户的本地时间保存或处理某些数据,您可以添加另一个 @app.route (with POST-method) 以接收该 Date() 值 @987654323 @来自网站的前端。
在后端接收时,您可能需要 to parse javascript Date() 对象(注意,在这种情况下,最好使用普通的 getTime()
方法,而不是 toLocaleString()
格式)到 Python 的 @ 987654332@,通过例如验证它webargs/marshmallow,并将其保存在用户的 session 中。
请注意,类似的问题之前已经been answered了。
【讨论】:
以上是关于烧瓶:将UTC时间转换为用户的本地时间的主要内容,如果未能解决你的问题,请参考以下文章