2010-08-03 1 views
39

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

>>> 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' 

ответ

-4

Что-то вроде следующего примера. Примечание. Я в Восточной Австралии (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' 
>>> 
+1

Небольшое исправление для форматирования: «% s% + 03d:% 02d»% (dtnow.isoformat(), hh, mm) –

+8

Использование вычитания для определения разницы между вашим часовым поясом и любым другим чревато опасностями. Намного лучше, когда вы предоставляете часовой пояс. –

+2

Я согласен: не используйте это решение. Не изобретайте велосипед. – osa

31

Вам необходимо сделать информацию о часовом поясе в времени суток. от datetime docs:

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

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

Чтобы сделать DateTime объекты знают, вам нужно subclass tzinfo, like the second example in here, или проще - использовать пакет, который делает это для вас, как pytz или python-dateutil

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

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

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

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

Не совсем корректно: директива формата% z печатает смещение часового пояса без двоеточия, однако формат ISO разделяет часы и минуты в спецификаторе TZ с двоеточием. Тем не менее, вызов метода isoformat() в дат-время, зависящем от часового пояса, будет работать! – tjollans

+4

Значения даты и времени, относящиеся к часовому поясу, будут корректно форматироваться с помощью .isoformat(). –

+1

Чтобы расширить комментарий от @ DavidK.Hess, 'strftime' в вашем втором примере слишком сложно. Следующие работы и (imo) являются более чистыми: 'datetime.now(). Replace (tzinfo = pytz.timezone (" US/Eastern ")). Isoformat()' – jedwards

46

Чтобы получить текущее время в формате 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.

+0

Начиная с Python 3.6, Метод 'astimezone()' теперь можно вызывать на наивных экземплярах, которые, как предполагается, представляют системное локальное время. –

+0

@ABB даже на Python 3.6 следует использовать известные объекты datetime, которые работают, даже если текущее местное время неоднозначно (например, во время переход DST). – jfs

16

С 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' 
2

Вы можете сделать это в Python 2.7+ с python-dateutil (который insalled на 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) 
Смежные вопросы