在Python中将ISO 8601日期时间转换为秒

Zay*_*iwa 19 python time iso8601 rfc3339 python-2.7

我想把两次加在一起.ISO 8601时间戳是'1984-06-02T19:05:00.000Z',我想将其转换为秒.我尝试使用Python模块iso8601,但它只是一个解析器.

有什么建议?

hop*_*pla 21

如果你想获得自纪元以来的秒数,你可以使用python-dateutil它将它转换为一个datetime对象,然后使用该strftime方法将其转换为秒.像这样:

>>> import dateutil.parser as dp
>>> t = '1984-06-02T19:05:00.000Z'
>>> parsed_t = dp.parse(t)
>>> t_in_seconds = parsed_t.strftime('%s')
>>> t_in_seconds
'455047500'
Run Code Online (Sandbox Code Playgroud)

所以你在那里一半:)

  • 对于 Python 3.3 及更高版本,您可以使用 `parsed_t.timestamp()` 来获取正确的时间。 (3认同)
  • `parsed_t.strftime('%s')`错了.`parsed_t.tzinfo == tzutc()`但是[`.strftime('%s')`总是使用本地时区,即使它可用](http://bugs.python.org/issue12750)(它可能和你的情况与utc不同.正确的答案是`455051100`,而不是`455047500`(检查`datetime.utcfromtimestamp(455051100)`). (2认同)

jfs*_*jfs 13

您的日期是RFC 3339格式的 UTC时间,您可以仅使用stdlib解析它:

from datetime import datetime

utc_dt = datetime.strptime('1984-06-02T19:05:00.000Z', '%Y-%m-%dT%H:%M:%S.%fZ')

# Convert UTC datetime to seconds since the Epoch
timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds()
# -> 455051100.0
Run Code Online (Sandbox Code Playgroud)

另请参阅在Python中将datetime.date转换为UTC时间戳

如何将其转换回ISO 8601格式?

要转换POSIX时间戳,请从中创建UTC日期时间对象,并使用.strftime()方法对其进行格式化:

from datetime import datetime, timedelta

utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
print(utc_dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ'))
# -> 1984-06-02T19:05:00.000000Z
Run Code Online (Sandbox Code Playgroud)

注意:它在小数点后面打印六位数(微秒).要获得三位数,请参阅将微秒格式化为2位小数(实际上将微秒转换为数十微秒).