为什么python 2.7不包括Z字符(Zulu或零偏移量)在UTC datetime对象的isoformat字符串结束不像JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
而在javascript中
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
为什么python 2.7不包括Z字符(Zulu或零偏移量)在UTC datetime对象的isoformat字符串结束不像JavaScript?
>>> datetime.datetime.utcnow().isoformat()
'2013-10-29T09:14:03.895210'
而在javascript中
>>> console.log(new Date().toISOString());
2013-10-29T09:38:41.341Z
当前回答
Python日期时间有点笨拙。使用箭头。
> 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的日期。Parse将悄悄地从时间戳中删除微秒。
其他回答
简短的回答
datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
长回答
不包含“Z”的原因是datetime.now()甚至datetime.utcnow()返回的是没有时区信息的datetimes,也就是说没有相关时区信息的datetimes。为了获得一个时区感知的datetime,你需要将一个timezone作为参数传递给datetime.now。例如:
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
一旦你有了一个时区感知的时间戳,isoformat就会包含一个时区标识。因此,您可以通过以下方式获得ISO 8601时间戳:
datetime.now(timezone.utc).isoformat()
#> '2020-09-03T20:53:07.337670+00:00'
“+00:00”是UTC的有效ISO 8601时区名称。如果你想用“Z”而不是“+00:00”,你必须自己做替换:
datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
#> '2020-09-03T20:53:07.337670Z'
我用钟摆:
import pendulum
d = pendulum.now("UTC").to_iso8601_string()
print(d)
>>> 2019-10-30T00:11:21.818265Z
Python日期时间有点笨拙。使用箭头。
> 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的日期。Parse将悄悄地从时间戳中删除微秒。
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是一个特殊情况)。
下面的javascript和python脚本给出相同的输出。我觉得这就是你想要的。
JavaScript
new Date().toISOString()
Python
from datetime import datetime
datetime.utcnow().isoformat()[:-3]+'Z'
它们给出的输出是格式化为ISO字符串的UTC (zulu)时间,其中有一个3毫秒的有效数字,并附加一个Z。
2019-01-19T23:20:25.459Z