【问题标题】:Python 3 time: difference in seconds between two timestampsPython 3时间:两个时间戳之间的秒差
【发布时间】:2017-12-18 21:32:36
【问题描述】:

我有两个时间戳字符串。我想在几秒钟内找出它们之间的区别。

我试过了:

from time import gmtime, strptime
a = "Mon 11 Dec 2017 13:54:36 -0700"
b = "Mon 11 Dec 2017 13:54:36 -0000"

time1 = strptime(a, "%a %d %b %Y %H:%M:%S %z")
time2 = strptime(b, "%a %d %b %Y %H:%M:%S %z")

time1-time2

出现错误:TypeError: unsupported operand type(s) for -: 'time.struct_time' and 'time.struct_time'

那么,如何使用打包时间计算差异?

我成功使用包 datetime - 在下面的代码中,但我想我读到 datetime 忽略了闰年的秒数,或者类似的东西。因此,我正在尝试使用“时间”:

from datetime import datetime
time1 = datetime.strptime(a, "%a %d %b %Y %H:%M:%S %z")
time2 = datetime.strptime(b, "%a %d %b %Y %H:%M:%S %z")
dif = time1 - time2
print(int(dif.total_seconds()))

非常感谢!

【问题讨论】:

  • "但我想我读到 datetime 忽略了闰年的秒数" 你在哪里读到的?我认为它可能会忽略跳跃 seconds 偶尔添加而没有真正的模式,但 probably 并不重要。
  • 对不起,你是对的 - 它忽略了闰秒
  • stackoverflow.com/questions/37928815/… 我想这应该会给你一些见解
  • @user3245256:如果您关心闰秒,time 模块不会做得更好。 timedatetime 使用相同的底层系统时间信息。
  • 另见bugs.python.org/issue23574,为了简单起见,大多数闰秒都被忽略了,特别是因为使用增量来计算未来的时间戳可以保证包含off-by-as-yet-unannounced-leap-seconds不。闰秒仅在 6 个月通知后添加,在处理比这更远的未来建模的日期时间时,您无法以任何有意义的方式考虑它们。

标签: python time timestamp


【解决方案1】:

首先,您使用的是time.strptime,它返回<class 'time.struct_time'>,并且它不支持减法运算符,实现您想要的一种可能的方法是转换为日期时间:

from datetime import datetime
from time import mktime
from time import gmtime, strptime

a = "Mon 11 Dec 2017 13:54:36 -0700"
b = "Mon 11 Dec 2017 13:54:36 -0000"

time1 = strptime(a, "%a %d %b %Y %H:%M:%S %z")
time2 = strptime(b, "%a %d %b %Y %H:%M:%S %z")

print(datetime.fromtimestamp(mktime(time1))-datetime.fromtimestamp(mktime(time2)))

或者更好的是,使用datetime.datetime.strptime,这样您就不需要中间转换。

有关支持的日期时间操作的更详细说明,请参阅文档here 中的supported operations 部分。特别是它说的部分:

如果两者都知道并且具有不同的 tzinfo 属性,则 a-b 的行为就像 a 和 b 首先首先转换为原始 UTC 日期时间。结果 是 (a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - b.utcoffset()) 除了实现永远不会溢出。

无论如何,也许你最好的机会是考虑一种替代方法,就像这个answer中提出的方法一样

【讨论】:

  • @user3245256 是的,上面的代码向您展示了如何使用日期时间的- 运算符,您可以看到它会忽略字符串的最后一部分ab .尝试将 b 更改为 b = "Mon 11 Dec 2017 13:54:31 -0000" 之类的内容,以便您观察到差异。
  • 抱歉,我不确定我是否理解。我的 b 就是这样。结果应该是 7 小时的差异,以秒表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2020-11-25
相关资源
最近更新 更多