使用python计算时差

Pri*_*rma 7 python time gps date difference

我想知道是否有一种方法或内置库可用于找到两个字符串输入的时间差异.

我的意思是,如果我有2个输入字符串:

  1. '2013-10-05T01:21:07Z'
  2. '2013-10-05T01:21:16Z'

如何计算时间差并将其打印为输出.

我知道这听起来有点傻,但对此有任何帮助表示赞赏.

Alf*_*lfe 7

使用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')
Run Code Online (Sandbox Code Playgroud)

这将解析给定的时间字符串作为本地时间(将夏令时(DST)设置为自动),结果是时间结构.这些仍然反映DST是明确地关闭(0),开启(1)还是隐式自动(-1).将它们转换为浮点数(自1970-01-01以来的秒数):

a = time.mktime(a)
b = time.mktime(b)
Run Code Online (Sandbox Code Playgroud)

然后计算差异(以秒为单位):

d = b - a
Run Code Online (Sandbox Code Playgroud)

并将它们转换为天/小时/分钟/秒:

days = int(d) / 86400
hours = int(d) / 3600 % 24
minutes = int(d) / 60 % 60
seconds = int(d) % 60
Run Code Online (Sandbox Code Playgroud)

最后一个块仅适用于正差异,所以小心不要交换ab;-)

但@JFSebastian正确地指出,这可能不是你想要的.从符号来看,您的字符串描述的是UTC时间,而不是当地时间.仅仅是时间差异,这与您的时间跨越DST开关有关.在这种情况下,它当然会导致时间差太小或一小时太小(因为UTC总是没有DST).

为避免这种情况,您可以将DST标志从自动(-1)设置为固定值(例如0表示关闭)并使用以下值:

a = time.mktime(a[:-1] + (0,))  # switch DST to off
b = time.mktime(b[:-1] + (0,))
Run Code Online (Sandbox Code Playgroud)

或者,正如@JFSebastian指出的那样,你可以忘记time模块,而是使用datetime.datetime不知道DST方面的模块:

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')
Run Code Online (Sandbox Code Playgroud)

然后结果是datetime可以直接减去的timedelta对象,以获得表示您想要的时间差的对象.打印它会产生类似于0:00:05你正在寻找的东西.


小智 7

您好像使用ISO 8601格式的dateTime.此格式用于许多地方,包括GPS交换格式.

[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
Run Code Online (Sandbox Code Playgroud)

使用日期时间:

import 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")
c = b - a
print(c)
Run Code Online (Sandbox Code Playgroud)

好处:

  • 内置于Python标准库
  • 面向对象的接口

缺点:

  • 需要手动处理其他有效的ISO 8601表示,例如'2013-10-05T01:21:16 + 00:00'
  • 引发闰秒的异常,例如'2012-06-30T23:59:60Z'

使用python-dateutil:

import dateutil.parser
a = dateutil.parser.parse("2013-10-05T01:21:07Z")
b = dateutil.parser.parse("2013-10-05T01:21:16Z")
c = b - a
print(c)
Run Code Online (Sandbox Code Playgroud)

好处:

  • 自动处理几乎任何时间格式

缺点:

  • 需要python-dateutil库(pip install python-dateutil)
  • 引发闰秒的异常,例如'2012-06-30T23:59:60Z'

使用Alfe建议的time.strptimetime.mktime

好处:

  • 内置于Python标准库
  • 可以解析闰秒,例如'2012-06-30T23:59:60Z'

缺点:

  • 需要手动处理其他有效的ISO 8601表示,例如'2013-10-05T01:21:16 + 00:00'
  • 在'2012-06-30T23:59:60Z'和'2012-07-01T00:00:00Z'之间丢失一秒((不可避免地知道下一次会发生闰秒)