ホームページ >バックエンド開発 >Python チュートリアル >Python と Django 間のタイムゾーンの問題
コーディングに時間の問題が絡むと、いつもタイムゾーンの問題に混乱しがちですが、私はいつも試行錯誤して対処してきましたが、今日ようやくその理由が分かり、心の中の問題が解決しました。
Pythonのタイムゾーンの問題
datetime.today() / datetime.now()
これら2つの関数は現在のシステム時刻を取得しますが、取得したdatetimeオブジェクトのtzinfoは、システム時刻に設定されている場合でも空です。ゾーン。
datetime.utcnow()
この関数は、現在のシステム時間とタイムゾーンに基づいて計算される現在の UTC 時間を取得します。
たとえば、システム時間が 14:00、タイムゾーンがアジア/上海 (北京時間) の場合、utcnow の戻り時間は 6:00 です。同様に、結果として得られるオブジェクトの tzinfo は空です。
上記の関数に対する環境変数 TZ の影響:
環境変数 TZ がシステムで設定されている場合、または os.environ['TZ'] が Python で設定されている場合、上記の関数によって取得される時間は TZ ですタイムゾーンに対応する時刻。実際には、TZ はこれらの機能ではなく、date コマンドの戻り結果からわかるようにシステム時刻に影響を与えると考えられます。 datetime.now() と date コマンドによって返される結果は常に一貫しています。
Django のタイムゾーン問題
Python の上記の関数を理解すると、Django のタイムゾーン問題は簡単に見えます。
djangoの設定には、プログラムで使用するタイムゾーンを設定するTIME_ZONEという設定があります。
Django のドキュメントから、TIME_ZONE の機能は os.environ['TZ'] を変更することであることがわかりましたが、os.environ['TZ'] を変更してもシステム環境変数 TZ は変更されません。したがって、TIME_ZONE が設定されている場合。システムのタイムゾーン設定が不一致の場合、プログラム中のdatetime.now()で取得される時刻とdateコマンドの時刻が不一致になります。
したがって、TIME_ZONE はプログラムが使用したいタイムゾーンに設定する必要があります。ローカル プログラムの場合は、TIME_ZONE を国際アプリケーションのシステム タイム ゾーンと同じに設定できます。TIME_ZONE を UTC に設定し、表示時に現在のユーザーのタイム ゾーンに合わせて調整することをお勧めします。
Manual
classmethod datetime.now([tz])
オプションの引数 tz が None であるか指定されていない場合、これは today() と似ていますが、可能であれば、より高い精度を提供します。 time.time() タイムスタンプを介して取得できます (たとえば、これは C の gettimeofday() 関数を提供するプラットフォームで可能です)。
それ以外の場合、tz はクラス tzinfo サブクラスのインスタンスであり、現在の日付でなければなりませんこの場合、結果は tz.fromutc(datetime.utcnow().replace(tzinfo=tz)) と同等になります。today()、utcnow().
classmethod datetime も参照してください。 utcnow()
tzinfo なしで現在の UTC 日付と時刻を返します。これは now() に似ていますが、現在の UTC 日付と時刻を naivedatetime オブジェクトとして返します。now() も参照してください。
タイム ゾーン変換コード
りー