1. ホーム
  2. パイソン

[解決済み】標準ライブラリだけを使って、UTCのdatetimeをローカルのdatetimeに変換する方法は?

2022-04-04 13:27:58

質問

私はパイソンを持っています datetime を使用して作成されたインスタンスは datetime.utcnow() で、データベースに永続化されます。

表示のために datetime データベースから取得したインスタンスを、ローカルの datetime をデフォルトのローカルタイムゾーンで使用する(つまり、あたかも datetime を使用して作成されました。 datetime.now() ).

どのようにすれば、UTC datetime をローカルな datetime Python 標準ライブラリのみを使って(例えば pytz 依存関係)ですか?

一つの解決策としては datetime.astimezone(tz) しかし、デフォルトのローカルタイムゾーンはどのように取得するのでしょうか?

解決方法は?

エポックからの秒数を計算し、time.localtime を使用してローカルの timzeone に変換し、time 構造体を datetime に戻す...というのがわかったと思います。

EPOCH_DATETIME = datetime.datetime(1970,1,1)
SECONDS_PER_DAY = 24*60*60

def utc_to_local_datetime( utc_datetime ):
    delta = utc_datetime - EPOCH_DATETIME
    utc_epoch = SECONDS_PER_DAY * delta.days + delta.seconds
    time_struct = time.localtime( utc_epoch )
    dt_args = time_struct[:6] + (delta.microseconds,)
    return datetime.datetime( *dt_args )

夏時間/冬時間のサマータイムを正しく適用します。

>>> utc_to_local_datetime( datetime.datetime(2010, 6, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 6, 6, 19, 29, 7, 730000)
>>> utc_to_local_datetime( datetime.datetime(2010, 12, 6, 17, 29, 7, 730000) )
datetime.datetime(2010, 12, 6, 18, 29, 7, 730000)