datetime
データベースを使用して作成されdatetime.utcnow()
、データベースに保存されたPython インスタンスがあります。
datetime
表示のために、データベースから取得したインスタンスを、datetime
デフォルトのローカル タイムゾーンを使用してローカルに変換したいと思います(つまり、 がdatetime
を使用して作成されたかのようにdatetime.now()
)。
Python 標準ライブラリのみ (依存関係なしなど)を使用してUTC をdatetime
ローカルに変換するにはどうすればよいですか?datetime
pytz
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.32010-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 で動作するかどうかはわかりません。