次のような日付d
があるとします:
>>> d
datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))
ご覧のとおり、「タイムゾーン対応」であり、2時間のオフセットがあり、utctimeは
>>> d.utctimetuple()
time.struct_time(tm_year=2009, tm_mon=4, tm_mday=19,
tm_hour=23, tm_min=12, tm_sec=0,
tm_wday=6, tm_yday=109, tm_isdst=0)
実際のUTC日付は2009年3月19日です2:12:00ですよね?
日付を文字列でフォーマットする必要があります
>>> d.strftime('%Y-%m-%d %H:%M:%S.%f')
'2009-04-19 21:12:00.000000'
これはこのオフセットを考慮していないようです。それを修正するには?
@Slamがすでに答えていることに加えて:
オフセットなしでUTC時間を出力する場合は、次のようにします。
from datetime import timezone, datetime, timedelta
d = datetime(2009, 4, 19, 21, 12, tzinfo=timezone(timedelta(hours=-2)))
d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S.%f')
Pythonドキュメントの datetime.astimezone を参照してください。
理由はpython実際のdatetimeオブジェクトのフォーマットであり、「この時点でのUTC」ではありません
フォーマットでタイムゾーンを表示するには、%z
または%Z
を使用します。
strf docs を探してください
これにより、現地時間がUTCに変換されて出力されます。
import datetime, pytz
from dateutil.tz.tz import tzoffset
loc = datetime.datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))
print(loc.astimezone(pytz.utc).strftime('%Y-%m-%d %H:%M:%S.%f') )
タイムゾーンモジュールをインポートできなかった(そして、その理由を知る時間があまりなかった)ので、/ etc/localtime情報をオーバーライドするTZ環境変数を設定しました
>>> import os
>>> import datetime
>>> print datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
2019-05-17 11:26
>>> os.environ["TZ"] = "UTC"
>>> print datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
2019-05-17 09:26