【问题标题】:Print a line in according to a timestamp根据时间戳打印一行
【发布时间】:2012-02-24 20:17:41
【问题描述】:

我写了这个:

def show_line(self):
    next_line = self.curr_line + 1
    self.line = self.lines[self.curr_line]
    y = self.line.split(' ')
    z = self.lines[next_line].split(' ')
    d1 = datetime.datetime.fromtimestamp(float(y[0]))
    d2 = datetime.datetime.fromtimestamp(float(z[0]))
    d3 = d2-d1  
    d3s = str(d3)
    sleep_time = int(float(d3s[6::]))*1000
    print_on_screen(self.line)
    glib.timeout_add(sleep_time, self.show_line)
    self.curr_line += 1
    return False

其中“line”是一个包含文件行的数组(我用 读线())。 在每一行中,都有时间戳,用于显示字符串 在屏幕上根据他们两个之间的差异(d3)。

问题是显示第一行,第三行,第五行,依此类推 并且不尊重时间戳。 有什么建议吗?

佛朗哥

【问题讨论】:

  • 以上到底有什么问题?你告诉我们你想做什么,而不是什么是错的。
  • 我对 glib.timeout_add 很好奇。你为什么用这个?一个问题是,当超时结束时,它会调用你的函数 self.showline,因此后面的行:“self.curr_line += 1”永远不会执行......
  • @Tom97531 这是不正确的。 self.curr_line += 1return False 行肯定会被执行。调用 glib.timeout_add(或 gobject.timeout_add,因为它似乎是为我调用的)不会以某种方式阻止函数的其余部分执行。

标签: python timestamp


【解决方案1】:

您正在将时间戳转换为毫秒数,但操作不正确:

d3s = str(d3)
sleep_time = int(float(d3s[6::]))*1000

我无法想象你为什么要这样做,将时间戳转换为字符串,从中提取一些字符,然后将其转换为浮点数,然后再次转换为整数。这段代码不清楚,但你肯定有一个错误:你为什么要丢弃字符串的前 6 个字符?

datetime.timedelta 转换为毫秒的正确方法是:

sleep_time = d3.total_seconds()*1000

您的代码还有其他问题:

  • 您应该使用utcfromtimestamp,而不是fromtimestamp。将时间戳转换为本地时间会引入对本地时区的依赖,并会带来所有的陷阱。例如,您可能在计算跨越日程表节省时间边界的 2 个时间戳之间的差异时遇到问题。这里不需要使用当地时间。您还不如在 UTC 工作。
  • 实际上,您根本不需要将时间戳转换为datetime.datetime 对象。为什么不直接减去时间戳?
  • 当您到达倒数第二行时,您遇到了错误。

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 2014-08-15
    • 2017-09-04
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多