首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python UTC datetime对象的ISO格式不包括Z(祖鲁或零偏移量)

Python UTC datetime对象的ISO格式不包括Z(祖鲁或零偏移量)
EN

Stack Overflow用户
提问于 2013-10-29 09:42:06
回答 13查看 264.8K关注 0票数 240

为什么python2.7在unlike对象的同格式字符串的末尾不包含Z字符(祖鲁或零偏移量),而不是JavaScript?

代码语言:javascript
运行
复制
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'

而在javascript中

代码语言:javascript
运行
复制
>>>  console.log(new Date().toISOString()); 
2013-10-29T09:38:41.341Z
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2014-05-16 22:54:38

Python对象默认没有时区信息,没有它,datetime实际上违反了ISO8601规范(如果没有提供时区信息,则假定为本地时间。)。您可以使用pytz封装获取一些默认时区,也可以自己直接获得子类tzinfo

代码语言:javascript
运行
复制
from datetime import datetime, tzinfo, timedelta
class simple_utc(tzinfo):
    def tzname(self,**kwargs):
        return "UTC"
    def utcoffset(self, dt):
        return timedelta(0)

然后您可以手动将时区信息添加到utcnow()中。

代码语言:javascript
运行
复制
>>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
'2014-05-16T22:51:53.015001+00:00'

请注意,这确实符合ISO8601格式,该格式允许Z+00:00作为UTC的后缀。请注意,后者实际上更符合标准,通常如何表示时区(UTC是特例)。

票数 78
EN

Stack Overflow用户

发布于 2017-03-14 03:59:40

选项:isoformat()

Python的datetime不支持UTC的军事时区后缀,比如'Z‘后缀。以下简单的字符串替换完成了这个任务:

代码语言:javascript
运行
复制
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实现同样的效果:

代码语言:javascript
运行
复制
In [4]: d.strftime('%Y-%m-%dT%H:%M:%SZ')
Out[4]: '2014-12-10T12:00:00Z'

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

请参阅:datetime.strftime()

附加:人类可读的时区

更进一步,您可能对显示带有strftime %Z时区标志的人类可读的时区信息感兴趣:

代码语言:javascript
运行
复制
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'
票数 138
EN

Stack Overflow用户

发布于 2020-09-03 21:02:44

简短回答

代码语言:javascript
运行
复制
datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")

长答案

不包含"Z“的原因是因为datetime.now()甚至datetime.utcnow()返回时区天真的日期时间,也就是说,没有关联时区信息的日期时间。要获得时区感知的日期时间,需要将时区作为参数传递给datetime.now。例如:

代码语言:javascript
运行
复制
from datetime import datetime, timezone

datetime.utcnow()
#> datetime.datetime(2020, 9, 3, 20, 58, 49, 22253)
# This is timezone naive

datetime.now(timezone.utc)
#> datetime.datetime(2020, 9, 3, 20, 58, 49, 22253, tzinfo=datetime.timezone.utc)
# This is timezone aware

一旦您有一个时区感知时间戳,等格式将包括一个时区指定。因此,您可以通过以下方式获得ISO 8601时间戳:

代码语言:javascript
运行
复制
datetime.now(timezone.utc).isoformat()
#> '2020-09-03T20:53:07.337670+00:00'

"+00:00“是UTC的有效ISO 8601时区标识。如果您想要"Z“而不是"+00:00",您必须自己做替换:

代码语言:javascript
运行
复制
datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
#> '2020-09-03T20:53:07.337670Z'
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19654578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档