Подтвердить что ты не робот

Python UTC datetime object Формат ISO не включает Z (смещение Zulu или Zero)

Почему python 2.7 не включает в себя символ Z (Zulu или нулевой сдвиг) в конце строки isoformat объекта 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
4b9b3361

Ответ 1

Объекты datetime и времени Python по умолчанию не имеют информации о часовом поясе, и без него Python фактически нарушает спецификацию ISO 8601 (если информация о часовом поясе не указана, предполагается, что это местное время). Вы можете использовать пакет pytz для получения часовых поясов по умолчанию или напрямую tzinfo подкласс 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 - особый случай).

Ответ 2

Опция: 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.

Смотрите: datetime.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'

Ответ 3

Даты Python немного неуклюжи. Используйте arrow.

> str(arrow.utcnow())
'2014-05-17T01:18:47.944126+00:00'

Arrow по сути имеет тот же API, что и datetime, но с часовыми поясами и некоторыми дополнительными функциями, которые должны быть в основной библиотеке.

Формат, совместимый с Javascript, может быть достигнут:

arrow.utcnow().isoformat().replace("+00:00", "Z")
'2018-11-30T02:46:40.714281Z'

Javascript Date.parse будет спокойно отбрасывать микросекунды с отметки времени.

Ответ 4

Следующие сценарии javascript и python дают идентичные результаты. Я думаю, это то, что вы ищете.

JavaScript

new Date().toISOString()

питон

import datetime

datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

Вывод, который они дают, - это время utc (zelda), отформатированное в виде строки ISO с значащей цифрой 3 миллисекунды и дополненной Z.

2019-01-19T23:20:25.459Z

Ответ 5

В Python> = 3.2 вы можете просто использовать это:

>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).isoformat()
'2019-03-14T07:55:36.979511+00:00'

Ответ 6

Объединив все ответы выше, я получил следующую функцию:

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)

Ответ 7

На пост есть много хороших ответов, но я хотел, чтобы формат получился таким же, как и в JavaScript. Это то, что я использую, и это хорошо работает.

In [1]: import datetime

In [1]: now = datetime.datetime.utcnow()

In [1]: now.strftime('%Y-%m-%dT%H:%M:%S') + now.strftime('.%f')[:4] + 'Z'
Out[3]: '2018-10-16T13:18:34.856Z'

Ответ 8

pip install python-dateutil
>>> a = "2019-06-27T02:14:49.443814497Z"
>>> dateutil.parser.parse(a)
datetime.datetime(2019, 6, 27, 2, 14, 49, 443814, tzinfo=tzutc())

Ответ 9

>>> import arrow

>>> now = arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS')
>>> now
'2018-11-28T21:34:59.235'
>>> zulu = "{}Z".format(now)
>>> zulu
'2018-11-28T21:34:59.235Z'

Или, чтобы получить это одним махом:

>>> zulu = "{}Z".format(arrow.utcnow().format('YYYY-MM-DDTHH:mm:ss.SSS'))
>>> zulu
'2018-11-28T21:54:49.639Z'