烧瓶:将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时间转换为用户的本地时间的主要内容,如果未能解决你的问题,请参考以下文章

将UTC时间字符串转换为用户的本地时间[重复]

将 UTC 日期时间字符串转换为本地日期时间

TSQL:如何将本地时间转换为 UTC? (SQL Server 2008)

Flask + Jinja:将 UTC 转换为本地时区

如何使用js将UTC日期转换为本地时间? [复制]

如何将UTC时间转化为本地时间