烧瓶:将UTC时间转换为用户本地时间

Joh*_*etz 6 python timezone datetime utc pytz

我正在尝试在 Flask 应用程序中将 UTC 时间转换为适当的本地时间。我想知道是否可以检测用户的时区并动态设置它。

到目前为止,这是我的代码,仅适用于US/Pacific时区中的每个人(datetimefilter这个 SO 问题中提取)

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)
Run Code Online (Sandbox Code Playgroud)

我想这无法在服务器端处理,因为时区将始终设置为服务器所在的任何位置?有没有办法通过改变来处理这个问题datetimefilter

use*_*508 4

如果您想动态检测网站上用户的本地时间,最简单的方法是通过 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)
Run Code Online (Sandbox Code Playgroud)

它会根据用户当地时间呈现以下结果:

UTC --> Local Time
Datetime right now is:

Dec 02 06:20 PM (utc)

Dec 03, 4:20 PM (local)
Run Code Online (Sandbox Code Playgroud)

然后,如果您需要根据用户的本地时间保存或处理某些数据,您可以添加另一个@app.route使用 POST-method )以通过 AJAX从网站前端接收该 Date() 值。

在后端接收后,您可能希望javascript Date() 对象(注意,在这种情况下最好使用普通getTime()方法,而不是toLocaleString()格式化)解析为 Python 的datetime,通过例如webargs /marshmallow 验证它,并保留例如,它在用户会话中。

请注意,之前已经回答了类似的问题。