2012-02-24 82 views
-2

我編碼此打印行:在根據時間戳

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 

其中「線」是包含該文件的線的陣列(I使用 readlines方法())。 在這些行的每一行中都有時間戳,用於根據屏幕上兩個字符串(d3)之間的差異在屏幕上顯示字符串 。

問題是顯示的第一行,第三個,第五個等等 並不尊重時間戳。 建議?

佛朗哥

+1

以上是什麼問題?你告訴我們你想做什麼,但不是什麼錯誤。 – 2012-02-24 20:22:37

+0

我很好奇glib.timeout_add。你爲什麼用這個?一個問題是,當超時完成時,它會調用你的函數self.showline,因此在調整之後:「self.curr_line + = 1」永遠不會執行... – Tom97531 2012-02-24 20:37:26

+0

@ Tom97531不正確。 'self.curr_line + = 1'和'return False'這兩行絕對會被執行。調用'glib.timeout_add'(或者'gobject.timeout_add',因爲它似乎是爲我調用的)不會以某種方式阻止該函數的其他部分執行。 – Celada 2012-02-26 00:37:45

回答

2

要轉換的時間戳,以毫秒爲單位的電話號碼,但你被錯誤地做它:

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

我無法想象,爲什麼你這樣做是通過時間戳轉換成字符串,提取一些字符,然後將其轉換爲浮點數,然後再次轉換,這次是整數。這段代碼並不清楚,但你肯定有一個錯誤:你爲什麼要丟棄字符串的前6個字符?

datetime.timedelta轉換成毫秒,正確的方法是:

sleep_time = d3.total_seconds()*1000 

您有其他問題,您的代碼:

  • 你應該使用utcfromtimestamp,不fromtimestamp。將時間戳轉換爲本地時間引入了對當地時區的依賴以及隨之而來的所有缺陷。例如,您可能在計算橫跨日間存儲時間邊界的兩個時間戳之間的差異時遇到問題。這裏沒有必要使用當地時間。你可能只是在UTC工作。
  • 實際上,你根本不需要將時間戳轉換爲datetime.datetime對象。你爲什麼不直接減去時間戳?
  • 當你到達倒數第二行時,你有一個錯誤。