Один комментарий: если вы на самом деле используете datetime.datetime.utcnow()
, вам не нужно делать никаких преобразований. Это время UTC, хотя технически это наивное время даты, потому что к нему не прикреплен атрибут .tzinfo
. (И вам также не нужно звонить str
.)
В противном случае, предполагая, что ваше время ввода фактически локально (не использует .utcnow()
), вы можете использовать time.timezone
, чтобы получить timedelta. Вот пример из моей системы, который является EST:
>>> import datetime
>>> import time
>>> localtime = datetime.datetime.now()
>>> localtime
datetime.datetime(2018, 11, 13, 13, 22, 54, 109529)
>>> datetime.datetime.utcnow()
datetime.datetime(2018, 11, 13, 18, 23, 3, 373213)
>>> convrt = localtime + datetime.timedelta(
... seconds=time.timezone)
>>>
>>> convrt
datetime.datetime(2018, 11, 13, 18, 22, 54, 109529)
>>> convrt.replace(tzinfo=datetime.timezone.utc).isoformat()
'2018-11-13T18:22:54.109529+00:00'
Обратите внимание, что .isoformat()
использует числовое смещение. Чтобы получить имя, используйте %Z
:
>>> convrt.replace(tzinfo=datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%S%Z")
'2018-11-13T18:22:54UTC'
time.timezone
- это смещение местного (не летнего) часового пояса в секундах к западу от UTC. Также есть time.altzone
, который смещен из местного часового пояса DST (секунды на запад).