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

为什么python 2.7不包括Z字符(祖鲁语或零偏移)在UTC datetime对象的isoformatstring不像JavaScript?

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

而在JavaScript中

 >>> console.log(new Date().toISOString()); 2013-10-29T09:38:41.341Z 

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不支持军事时区后缀,如UTC的“Z”后缀。 下面这个简单的stringreplace就是这样的:

 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' 

注意:只有当您知道指定的date是UTC时,此选项才起作用。


附加:人类可读的时区

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

Pythondate时间有点笨重。 使用arrow

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

箭头与date时间基本相同,但时区和一些额外的细节应该在主库中。