Формат ISO объекта Python UTC datetime не включает Z (Zulu или нулевое смещение)
почему python 2.7 не включает символ Z (Zulu или нулевое смещение) в конце строки изоформата объекта UTC datetime в отличие от JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
тогда как в javascript
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
4 ответов:
Python
datetimeобъекты по умолчанию не имеют информации о часовом поясе, и без нее Python фактически нарушает спецификацию ISO 8601 (если информация о часовом поясе не указана, предполагается, что это местное время). Вы можете использовать пакета pytz чтобы получить некоторые часовые пояса по умолчанию, или непосредственно подклассtzinfoсам себе:from datetime import datetime, tzinfo, timedelta class simple_utc(tzinfo): def tzname(self,**kwargs): return "UTC" def utcoffset(self, dt): return timedelta(0)затем вы можете вручную добавить информацию о часовом поясе в
utcnow():>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat() '2014-05-16T22:51:53.015001+00:00'обратите внимание, что это соответствует формату ISO 8601, что позволяет либо
Zили+00:00как суффикс для UTC. Обратите внимание, что последний фактически соответствует стандарту лучше, с тем, как часовые пояса представлены в целом (UTC-это особый случай.)
:
isoformat()в Python
datetimeне поддерживает военный пояс суффиксы, такие как ' Z ' суффикс для UTC. Следующая простая замена строки делает трюк:In [1]: import datetime In [2]: d = datetime.datetime(2014, 12, 10, 12, 0, 0) In [3]: str(d).replace('+00:00', 'Z') Out[3]: '2014-12-10 12:00:00Z'
str(d)по сути то же самое, чтоd.isoformat(sep=' ')посмотреть: Datetime, Стандартная Библиотека Python
:strftime()или вы могли бы использовать
strftimeдля достижения той же эффект:In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ') Out[4]: '2014-12-10 12:00:00Z'Примечание: эта опция работает только тогда, когда вы знаете, что дата указана в формате UTC.
посмотреть: дата и время.strftime ()
Дополнительно: Читаемый Человеком Часовой Пояс
идя дальше, вы можете быть заинтересованы в отображении читаемой человеком информации о часовом поясе,
pytzСstrftime%Zчасовой пояс флаг:In [5]: import pytz In [6]: d = datetime.datetime(2014, 12, 10, 12, 0, 0, tzinfo=pytz.utc) In [7]: d Out[7]: datetime.datetime(2014, 12, 10, 12, 0, tzinfo=<UTC>) In [8]: d.strftime('%Y-%m-%d %H:%M:%S %Z') Out[8]: '2014-12-10 12:00:00 UTC'
datetime-значений в Python немного неуклюжим. Используйте
arrow.> str(arrow.utcnow()) '2014-05-17T01:18:47.944126+00:00'Arrow имеет по существу тот же api, что и datetime, но с часовыми поясами и некоторыми дополнительными тонкостями, которые должны быть в основной библиотеке.
объединив все ответы выше я пришел со следующей функцией:
from datetime import datetime, tzinfo, timedelta class simple_utc(tzinfo): def tzname(self,**kwargs): return "UTC" def utcoffset(self, dt): return timedelta(0) def getdata(yy, mm, dd, h, m, s) : d = datetime(yy, mm, dd, h, m, s) d = d.replace(tzinfo=simple_utc()).isoformat() d = str(d).replace('+00:00', 'Z') return d print getdata(2018, 02, 03, 15, 0, 14)
Comments