根据时间戳打印一行

时间:2012-02-24 20:17:41

标签: python timestamp

我编码了这个:

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”是一个包含文件行的数组(我使用过 readlines())。 在每一行中都有时间戳,用于显示字符串 在屏幕上根据其中两个之间的差异(d3)。

问题是显示第1行,第3行,第5行等等 而不是尊重时间戳。 建议?

佛朗哥

1 个答案:

答案 0 :(得分:2)

您正在将时间戳转换为毫秒数,但您做错了:

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个对象。你为什么不直接减去时间戳呢?
  • 当你到倒数第二行时,你有一个错误。