Python将UTC格式字符串(1970-01-19T15:59:38.721115895Z)转换为时间对象的系列操作

979 阅读2分钟

首先我们科普一下:

东八区(UTC/GMT+08:00)是比世界协调时间(UTC)/ 格林尼治时间 (GMT)快8小时的时区,理论上的位置是位于东经112.5度至127.5度之间,是东盟标准的其中一个候选时区。当 格林尼治标准时间 为0:00时,东八区的标准时间为08:00

这种时间的表示就是UTC通用标准时,以Z标识

少废话直接上代码

import time
str_time = '1970-01-19T15:59:38.721115895Z'
refactor_time = time.strptime(str(str_time.replace('T', ' ').replace('Z', '')[:-3]), "%Y-%m-%d %H:%M:%S.%f")

最终得到的refactor_timetime.struct_time(tm_year=1970, tm_mon=1, tm_mday=19, tm_hour=15, tm_min=59, tm_sec=38, tm_wday=0, tm_yday=19, tm_isdst=-1),接下来就可以用这个time相关的object进行之后的使用了,例如将其转换为自纪元以来的秒数,使用如下代码:

import calendar
second = calendar.timegm(refactor_time)

更多用法可以参考:time — 时间的访问和转换 — Python 3.9.2rc1 文档

接下来我们详细解释下第一段代码

  • str_time.replace('T', ' ').replace('Z', ''):将原始字符串格式中的T和Z替换为空格,变成strptime可以识别的字符串类型,这一步主要是字符串转换
  • [:-3]:截取字符串/舍弃字符串最后三位,这里是895

这里这样的做的原因是,如果不舍弃会报错:

File “/usr/lib/python2.7/_strptime.py”, line 478, in _strptime_time
   return _strptime(data_string, format)[0]
File “/usr/lib/python2.7/_strptime.py”, line 335, in _strptime
   data_string[found.end():])
ValueError: unconverted data remains: 895

才想可能是小数点后太长了,因此这里截断一点

否则会报错:

ValueError: '9' is a bad directive in format '%Y-%m-%d %H:%M:%S.%9f'

Resources