標準ライブラリのみを使用して UTC の日時をローカルの日時に変換するにはどうすればよいでしょうか? 質問する

標準ライブラリのみを使用して UTC の日時をローカルの日時に変換するにはどうすればよいでしょうか? 質問する

datetimeデータベースを使用して作成されdatetime.utcnow()、データベースに保存されたPython インスタンスがあります。

datetime表示のために、データベースから取得したインスタンスを、datetimeデフォルトのローカル タイムゾーンを使用してローカルに変換したいと思います(つまり、 がdatetimeを使用して作成されたかのようにdatetime.now())。

Python 標準ライブラリのみ (依存関係なしなど)を使用してUTC をdatetimeローカルに変換するにはどうすればよいですか?datetimepytz

1 つの解決策は を使用することのようですdatetime.astimezone(tz)が、デフォルトのローカル タイムゾーンを取得するにはどうすればよいでしょうか?

ベストアンサー1

Python 3.3 以降の場合:

from datetime import datetime, timezone

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)

Python 2/3の場合:

import calendar
from datetime import datetime, timedelta

def utc_to_local(utc_dt):
    # get integer timestamp to avoid precision lost
    timestamp = calendar.timegm(utc_dt.timetuple())
    local_dt = datetime.fromtimestamp(timestamp)
    assert utc_dt.resolution >= timedelta(microseconds=1)
    return local_dt.replace(microsecond=utc_dt.microsecond)

使用方法pytz(Python 2/3 の両方):

import pytz

local_tz = pytz.timezone('Europe/Moscow') # use your local timezone name here
# NOTE: pytz.reference.LocalTimezone() would produce wrong result here

## You could use `tzlocal` module to get local timezone on Unix and Win32
# from tzlocal import get_localzone # $ pip install tzlocal

# # get local timezone    
# local_tz = get_localzone()

def utc_to_local(utc_dt):
    local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
    return local_tz.normalize(local_dt) # .normalize might be unnecessary

def aslocaltimestr(utc_dt):
    return utc_to_local(utc_dt).strftime('%Y-%m-%d %H:%M:%S.%f %Z%z')

print(aslocaltimestr(datetime(2010,  6, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime(2010, 12, 6, 17, 29, 7, 730000)))
print(aslocaltimestr(datetime.utcnow()))

出力

Python 3.3
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.093745 MSK+0400
Python 2
2010-06-06 21:29:07.730000 
2010-12-06 20:29:07.730000 
2012-11-08 14:19:50.093911 
ピッツ
2010-06-06 21:29:07.730000 MSD+0400
2010-12-06 20:29:07.730000 MSK+0300
2012-11-08 14:19:50.146917 MSK+0400

注: DST と、MSK タイムゾーンの UTC オフセットの最近の変更を考慮に入れています。

pytz 以外のソリューションが Windows で動作するかどうかはわかりません。

おすすめ記事