使用Python计算时差

时间:2014-05-27 09:12:40

标签: python date time gps difference

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

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

  1. '2013-10-05T01:21:07Z'
  2. '2013-10-05T01:21:16Z'
  3. 如何计算时间差并将其打印为输出。

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

3 个答案:

答案 0 :(得分: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')

这会将给定的时间字符串解析为本地时间(将夏令时(DST)设置为自动),结果是时间结构。这些仍然反映DST是明确地关闭(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

最后一个块仅适用于正差异,因此请注意不要交换ab; - )

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

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

a = time.mktime(a[:-1] + (0,))  # switch DST to off
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的内容,这可能正是您正在寻找的内容。

答案 1 :(得分:7)

您似乎使用的是ISO 8601格式dateTime。此格式用于许多地方,包括GPS交换格式。

[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]

使用datetime:

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)

<强>优点:

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

<强>缺点:

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

使用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)

<强>优点:

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

<强>缺点:

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

使用Alfe

建议的time.strptime和time.mktime

<强>优点:

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

<强>缺点:

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

答案 2 :(得分:-2)

import datetime
a = datetime.datetime.now()
b = datetime.datetime.now()
c = b - a
datetime.timedelta(0, 8, 562000)
divmod(c.days * 86400 + c.seconds, 60)

原始答案 here