Flaskで日時を日本標準時(JST)に変換する方法【Flask-Momentを使ってみよう】
2024年10月3日

こんにちは!
今回の記事では、Flaskで日時を日本標準時(JST)に変換する方法について解説します。
Flaskで日時を変更する方法はいくつかありますが、今回の記事ではFlask-Momentというライブラリを使う方法を解説します。
Flask-Momentとは?
Flask-Momentは、Flaskアプリケーションで日時を簡単に操作・表示するための拡張機能です。
これは、JavaScriptの日時操作ライブラリであるMoment.jsをFlaskテンプレートと統合し、クライアントサイドでの日時のフォーマットやタイムゾーン変換を容易にします。
Flask-Momentを使用することで、日時表示に関する複雑な処理を簡素化し、ユーザーにとって見やすく、理解しやすい情報を提供できます。
主な特徴としては、サーバー側でUTCの日時を保持し、フロント側でユーザーのタイムゾーンに合わせて表示します。フロント側は、Flaskのテンプレート内で簡潔な記法で日時を操作・表示することができます。
Flask-Momentのインストールとセットアップ
ここからは、Flask-Momentをプロジェクトに導入するための手順を詳しく見ていきましょう。
Flask-Momentのインストール
まず、Flask-Momentをインストールします。ターミナルで以下のコマンドを実行してください。
pip install flask-moment pytz
pytzはタイムゾーンの処理に必要なライブラリです。
Flaskアプリケーションへの組み込み
次に、FlaskアプリケーションにFlask-Momentを組み込みます。
app.pyファイルを作成し、基本的なFlaskアプリケーションを設定します。
from flask import Flask, render_template
from flask_moment import Moment
from datetime import datetime
import pytz
app = Flask(__name__)
moment = Moment(app)
@app.route('/')
def index():
# 現在のUTC時刻を取得
utc_now = datetime.utcnow()
# JSTタイムゾーンを設定
jst = pytz.timezone('Asia/Tokyo')
# UTC時刻をJSTに変換
jst_now = utc_now.replace(tzinfo=pytz.utc).astimezone(jst)
return render_template('index.html', current_time=jst_now)
if __name__ == '__main__':
app.run(debug=True)
moment = Moment(app)の部分では、flask-moment
のインスタンスを作成し、Flaskアプリケーションに登録します。これにより、テンプレート内でflask-moment
の機能を利用できるようになります。
flask-moment
自体はクライアント側で時刻を処理するため、上記のapp.py
では、pytz
を使用してUTC時刻をJSTに変換しています。
テンプレートの作成
続いて、テンプレートを作成します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Flask Moment JST Example</title>
{{ moment.include_moment() }}
</head>
<body>
<h1>現在時刻(JST)</h1>
<p>{{ moment(current_time).format('LLLL') }}</p>
<!-- リアルタイムで時刻を更新する場合 -->
<p>リアルタイム更新: <span id="current-time">{{ moment(current_time).format('LLLL') }}</span></p>
<script>
setInterval(function() {
var now = moment().tz("Asia/Tokyo").format('LLLL');
document.getElementById('current-time').innerHTML = now;
}, 1000);
</script>
</body>
</html>
上記のテンプレートの解説をします。
まず、ヘッダー部分で以下のタグを追加することで、moment.js
ライブラリを読み込みます。
{{ moment.include_moment() }}
続いて、moment
フィルターを使用して時刻をフォーマットします。
<p>{{ moment(current_time).format('LLLL') }}</p>
‘LLLL’はmoment.jsのフォーマットオプションで、例えば「2024年4月27日土曜日 15:30」のように表示されます。
クライアント側でリアルタイムに時刻を更新する場合は、JavaScriptを用いて定期的に時刻を更新します。上記のテンプレート例では、1秒ごとに時刻を更新しています。
まとめ
本記事では、Flaskとflask-moment
を使用して時刻をJSTに設定する方法について解説しました。
flask-momentを活用することで、ユーザーにとって見やすく直感的な時刻表示が実現できます。特にタイムゾーンが重要な日本国内向けのアプリケーションでは、JSTへの正確な設定が不可欠です。ぜひ本記事を参考に、Flaskアプリケーションでの時刻表示を改善してみてください。
参考資料
Pythonの基礎から応用まで学べる
Python WebAcademy
Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

インフラの学習はInfraAcademy

おすすめの記事









