flask:将utc时间转换为用户本地时间

flask: convert utc time to user's local time

我正在尝试在 Flask 应用程序中将 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?

来解决这个问题

如果您想动态检测用户在网站上的本地时间,最简单的方法是通过 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.routewith POST-method) to receive that Date() value via AJAX来自网站的前端。

在后端接收后,您可能需要 to parse javascript Date() object (note, that in this case it's better to use plain getTime() method, instead of toLocaleString() formatting) into Python's datetime, validate it via e.g. webargs/marshmallow, and keep it in, say, user's session

请注意,类似的问题已经 been answered 更早了。