Формат 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
800   4  

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

    Ничего не найдено.