Как получить строку 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)