2017-12-02 317 views
0

我試圖將UTC時間轉換爲燒瓶應用程序中的相應本地時間。我想知道如果我可以檢測用戶的時區並動態設置它。flask:將utc時間轉換爲用戶的當地時間

這是到目前爲止我的代碼,其適合於所有人的US/Pacific時區唯一的(從this SO questiondatetimefilter

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

如果要動態檢測用戶在網站上的本地時間,最簡單的方法是通過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),從網站的前端接收Date()值via AJAX

當接收到後端側,你可能想to parse JavaScript的日期()對象(注意,在這種情況下,最好使用純getTime()方法,而不是toLocaleString()格式)轉換成Python的datetime,驗證它通過如webargs /棉花糖,並保存在,比如用戶的session

請注意類似的問題已經提前been answered

相關問題