2017-12-02 8 views
0

フラスコのアプリケーションでUTC時刻を適切な現地時間に変換しようとしています。私はユーザーのタイムゾーンを検出し、それを動的に設定できるかどうか疑問に思っています。これは、これまでのタイムゾーンは常にセットされますので、サーバー側を扱うことができない私はこれを想像フラスコ:ユーザのローカル時刻に変換する

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) 

のみ(datetimefilterthis SO questionからプル)US/Pacificタイムゾーンで皆のために働く私のコードです

どこにサーバーがありますか? 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を受け取ることができます。

バックエンド側で受信すると、あなたはおそらく経由で、例えば、それを検証し、Pythonのdatetimeto parse javascriptの日付()オブジェクト(代わりにtoLocaleString()フォーマットのこのような場合には、それはプレーンなgetTime()メソッドを使用することをお勧めしますことをメモして、)したいですwebargs/marshmallowとし、ユーザーのsessionなどに保管してください。

同様の質問はすでにbeen answeredになっていますのでご注意ください。

関連する問題