使用
strptime()
解析字符串:
a = time.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ')
b = time.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ')
这将把给定的时间字符串解析为本地时间(将夏令时设置为自动),结果是时间结构体。这些仍然反映了夏令时是否明确关闭(0)、开启(1)或隐含自动(-1)。将其转换为浮点数(从1970年01月01日开始算起的秒数):
a = time.mktime(a)
b = time.mktime(b)
然后计算差值(以秒为单位):
d = b - a
将它们转换为天/小时/分钟/秒:
days = int(d) / 86400
hours = int(d) / 3600 % 24
minutes = int(d) / 60 % 60
seconds = int(d) % 60
最后一个块只适用于正差值,所以小心不要交换
a
和
b
;-)
但是 @J.F.Sebastian 正确指出这可能不是您想要的。从符号表示来看,似乎您的字符串描述的是 UTC 时间,而不是本地时间。对于仅涉及时间差异的情况,如果您的时间跨越了夏令时切换,则这一点非常重要。在这种情况下,它当然会导致时间差异过大或过小一小时(因为 UTC 总是不考虑夏令时)。
为避免此问题,您可以将 DST 标志从自动(-1)设置为固定值(例如关闭的 0),并使用这些值:
a = time.mktime(a[:-1] + (0,))
b = time.mktime(b[:-1] + (0,))
另外,正如@J.F.Sebastian指出的那样,您可以忽略time
模块,而是使用不考虑DST方面的datetime.datetime
:
a = datetime.datetime.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ')
b = datetime.datetime.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ')
然后返回的结果是datetime
对象,可以直接相减得到一个timedelta
对象,表示所需的时间差。打印它将会得到类似于0:00:05
的结果,这很可能正是你要寻找的。