我正在尝试将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
?
答案 0 :(得分:1)
如果要在网站上动态检测用户的本地时间,最简单的方法是通过JavaScript Date()对象获取浏览器的日期时间。这样,您可以显示正确的本地时间,而无需检测字面意义上的任何内容。您的代码段可能如下所示:
@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()值来自网站前端的via AJAX。
在后端收到后,您可能需要to parse javascript Date()对象(请注意,在这种情况下,最好使用普通getTime()
方法,而不是{{1}格式化到Python的toLocaleString()
,通过例如验证它webargs / marshmallow,并将其保留在用户的session中。
请注意,类似问题早先已been answered。