2017-06-05 470 views
1

我需要使用Tcl在24:00 hr格式時鐘中計算一天中兩個時間段之間的時間差。如何使用時鐘命令計算Tcl中的時間跨度

假設我的開始時間是上午06:30:00,結束時間是晚上18:30:00。我在Windows中使用Active Tcl 8.5和8.6嘗試了以下方法。

set morn [clock scan 06:30:00 -format %H:%M:%S] 
set even [clock scan 18:30:00 -format %H:%M:%S] 
set diff [clock format [expr $even - $morn ] -format %H:%M:%S] 

答案應該是12:00:00這是實際的差異,但是,我得到的答案爲17:30:00這完全是混淆。

我認爲05:30:00的GMT時差正在加入差異,因爲我在GMT + 5:30時區(IST)中。

我該如何得到確切的區別?

回答

1

clock命令沒有了什麼東西轉換時間間隔人類可讀的形式,因爲它專注於處理時間瞬間

你是正確的,你在時區導致時間間隔出奇怪。通過-gmt 1選項會有所幫助,但直到您獲得24小時或更長的時間間隔。在那一點上,它會迴圈,看起來很奇怪。

處理此問題的方法是直接進行格式設置。這不是很難。

proc formatTimeInterval {intervalSeconds} { 
    # *Assume* that the interval is positive 
    set s [expr {$intervalSeconds % 60}] 
    set i [expr {$intervalSeconds/60}] 
    set m [expr {$i % 60}] 
    set i [expr {$i/60}] 
    set h [expr {$i % 24}] 
    set d [expr {$i/24}] 
    return [format "%+d:%02d:%02d:%02d" $d $h $m $s] 
} 
puts [formatTimeInterval [expr {$even - $morn}]] 
#==> +0:12:00:00 
+0

非常感謝你幫助了很多:-) – chaitanyak

+0

我應該提及這些是*理想的*天,而不是真正的,所以不要考慮DST變化等複雜性。處理(比如所有與時間有關的事情)比乍一看更難。 –

0

我不明白你爲什麼不使用-timezone選項? 我在TZ = CET所以我的答案是13:00:00

如果我添加「-timezone UTC」選項,我得到正確的答案:

set morn [clock scan 06:30:00 -format %T] 
puts "morn = $morn" 

set even [clock scan 18:30:00 -format %T] 
puts "even = $even" 

set diff [clock format [expr $even - $morn ] -format "%Y:%m:%d %T"] 
puts "diff = $diff" 

puts "difference = [expr $even - $morn]" 

puts "with -timezone UTC = [clock format [expr $even - $morn ] -timezone UTC -format %T]" 

顯示的是

morn = 1496723400 
even = 1496766600 
diff = 1970:01:01 13:00:00 
difference = 43200 
with -timezone UTC = 12:00:00 
+0

嗨..謝謝你的建議。顯然「-timezone UTC」的確如同Donal所引用的「-gmt 1」一樣工作。 – chaitanyak

+0

「GMT +1」或「UTC +2對我來說,因爲我的TZ是CEST。對我來說? –

+0

我設置了我的UNIX機器(對不起,我沒有機會在Windows機器上設置)並查看結果: $ sudo的systemsetup -gettimezone 時區:亞洲/加爾各答 相同的命令 結果如上。 早晨= 1496710800 即使= 1496754000 DIFF = 1970:01:01 17:30:00 差= 43200 與-timezone UTC = 12:00:00 –