Python UTC日期时间对象的ISO格式不包括Z(Zulu或零偏移)

问题描述 投票:72回答:8

为什么python 2.7在UTC日期时间对象的isoformat字符串末尾不包含Z字符(Zulu或零偏移量)?

>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'

而在javascript中

>>>  console.log(new Date().toISOString()); 
2013-10-29T09:38:41.341Z
python python-2.7 datetime timestamp iso8601
8个回答
40
投票

Python datetime对象默认没有时区信息,没有它,Python实际上违反了ISO 8601规范(if no time zone info is given, assumed to be local time)。您可以使用pytz package获取一些默认时区,或者直接将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'

请注意,此DOES符合ISO 8601格式,允许使用Z+00:00作为UTC的后缀。请注意,后者实际上更符合标准,一般如何表示时区(UTC是一种特殊情况。)


36
投票

Option: isoformat()

Python的datetime不支持military timezone后缀,如UTC的'Z'后缀。以下简单的字符串替换可以解决问题:

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 Standard Library

Option: strftime()

或者你可以使用strftime来达到同样的效果:

In [4]: d.strftime('%Y-%m-%d %H:%M:%SZ')
Out[4]: '2014-12-10 12:00:00Z'

注意:仅当您知道指定的日期是UTC时,此选项才有效。

见:datetime.strftime()


Additional: Human Readable Timezone

更进一步,你可能有兴趣显示人类可读的时区信息,pytzstrftime %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'

7
投票

Python日期时间有点笨拙。使用arrow

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

Arrow与datetime基本上具有相同的api,但是时区和一些额外的细节应该在主库中。

可以通过以下方式实现与Javascript兼容的格式:

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

Javascript Date.parse将从时间戳中悄然降低微秒。


6
投票

以下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'

1
投票

通过结合上面的所有答案,我带来了以下功能:

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)

1
投票

帖子上有很多好的答案,但我希望格式与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'

1
投票
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())

-2
投票
>>> 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'
© www.soinside.com 2019 - 2024. All rights reserved.