Я должен произвести строку времени, которая соответствует формату 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'
Примерно как в следующем примере. Обратите внимание, я нахожусь в Восточной Австралии (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'
>>>
Вам нужно сделать так, чтобы ваши объекты 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')