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

新手上路,请多包涵

为什么 python 2.7 不像 JavaScript 那样在 UTC 日期时间对象的同种格式字符串的末尾包含 Z 字符(Zulu 或零偏移量)?

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

而在 javascript 中

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

原文由 Murali Mopuru 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 876
2 个回答

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 是一个特例。)

原文由 stiv 发布,翻译遵循 CC BY-SA 3.0 许可协议

选项: isoformat()

Python 的 datetime 不支持 军事时区 后缀,例如 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=' ') 相同

请参阅: 日期时间、Python 标准库

选项: strftime()

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

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

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

参见: datetime.strftime()


附加:人类可读时区

更进一步,您可能对显示人类可读的时区信息 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'

原文由 Manav Kataria 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题