Как получить строку isotformat datetime, включая часовой пояс по умолчанию?

Мне нужно создать строку времени, которая соответствует формату iso yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE. Методы класса now() и utcnow() почти делают то, что я хочу.

>>> import datetime
>>> #time adjusted for current timezone
>>> datetime.datetime.now().isoformat()
'2010-08-03T03:00:00.000000'
>>> #unadjusted UTC time
>>> datetime.datetime.utcnow().isoformat()
'2010-08-03T10:00:00.000000'
>>>
>>> #How can I do this?
>>> datetime.datetime.magic()
'2010-08-03T10:00:00.000000-07:00'

Ответ 1

Что-то вроде следующего примера. Примечание. Я в Восточной Австралии (UTC + 10 часов на данный момент).

>>> import datetime
>>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow()
>>> dtnow
datetime.datetime(2010, 8, 4, 9, 33, 9, 890000)
>>> dtutcnow
datetime.datetime(2010, 8, 3, 23, 33, 9, 890000)
>>> delta = dtnow - dtutcnow
>>> delta
datetime.timedelta(0, 36000)
>>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60)
>>> hh,mm
(10, 0)
>>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm)
'2010-08-04T09:33:09.890000+10:00'
>>>

Ответ 2

Чтобы получить текущее время в UTC в Python 3.2 +:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2015-01-27T05:57:31.399861+00:00'

Чтобы получить локальное время в Python 3.3 +:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).astimezone().isoformat()
'2015-01-27T06:59:17.125448+01:00'

Объяснение: datetime.now(timezone.utc) создает объект времени datetime, соответствующий часовому поясу, в UTC. astimezone() затем изменяет часовой пояс объекта datetime на часовой пояс системы, если он вызван без аргументов. Значения datetime, относящиеся к часовому поясу, затем автоматически создают правильный формат ISO.

Ответ 3

Вам нужно сообщить о часовом поясе ваших объектов datetime. из datetime docs:

Существует два типа объектов даты и времени: "наивный" и "осознанный". Это различие относится к тому, имеет ли объект какое-либо представление о часовом поясе, летнее время или другое алгоритмическое или политическое регулирование времени. Независимо от того, представляет ли наивный объект datetime координационное универсальное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит только от программы, как и до программы, независимо от того, представляет ли конкретное число метры, мили или массу. Наивные объекты datetime легко понять и работать, ценой игнорирования некоторых аспектов реальности.

Когда у вас есть известный объект datetime, вы можете использовать isoformat() и получить нужный вам результат.

Чтобы ваши объекты datetime знали, вам нужно подкласс tzinfo, как и второй пример здесь, или проще - использовать пакет это делает это для вас, например pytz или python-dateutil

Используя pytz, это будет выглядеть так:

import datetime, pytz
datetime.datetime.now(pytz.timezone('US/Central')).isoformat()

Вы также можете управлять выходным форматом, если вы используете strftime с директивой формата '% z', например

datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')

Ответ 4

С arrow:

>>> import arrow
>>> arrow.now().isoformat()
'2015-04-17T06:36:49.463207-05:00'
>>> arrow.utcnow().isoformat()
'2015-04-17T11:37:17.042330+00:00'

Ответ 5

Вы можете сделать это в Python 2.7+ с python-dateutil (который по умолчанию неактивен на Mac):

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> datetime.now(tzlocal()).isoformat()
'2016-10-22T12:45:45.353489-03:00'

Или вы, если хотите преобразовать из существующей сохраненной строки:

>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from dateutil.parser import parse
>>> parse("2016-10-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-10-21T16:33:27.696173-03:00' <-- Atlantic Daylight Time (ADT) 
>>> parse("2016-01-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
'2016-01-21T16:33:27.696173-04:00' <-- Atlantic Standard Time (AST)