【问题标题】:flask: convert utc time to user's local time烧瓶:将UTC时间转换为用户的本地时间
【发布时间】:2018-05-16 18:22:21
【问题描述】:

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

到目前为止,这是我的代码,仅适用于 US/Pacific 时区的所有人(datetimefilterthis 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来处理这个问题?

【问题讨论】:

    标签: python datetime timezone utc pytz


    【解决方案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了。

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 2014-07-18
      • 2021-02-04
      • 2010-09-15
      • 2011-05-01
      • 2019-04-30
      • 2017-03-20
      相关资源
      最近更新 更多