Как получить строку даты и времени изоформата включая часовой пояс по умолчанию?

Я должен произвести строку времени, которая соответствует формату 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'
50
задан deft_code 3 August 2010 в 12:40
поделиться

2 ответа

Примерно как в следующем примере. Обратите внимание, я нахожусь в Восточной Австралии (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'
>>>
-7
ответ дан 7 November 2019 в 10:39
поделиться

Вам нужно сделать так, чтобы ваши объекты 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')
37
ответ дан 7 November 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: