我需要使用Tcl计算24:00小时格式时钟中一天中两个时段之间的时间差。
假设我的开始时间是早上06:30,结束时间是晚上6:30。在windows中使用Active TCL8.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,这是实际的区别,但是,我得到的答案是17:30,这是完全混乱的。
我假定格林尼治时间差在05:30:00被添加到了差异中,因为我在一个GMT+5:30时区。
我怎么才能得到确切的区别呢?
发布于 2017-06-05 13:24:52
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发布于 2017-06-06 08:49:37
我不明白你为什么不使用-timezone选项?我在TZ=CET,所以我的答案是13: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:00https://stackoverflow.com/questions/44366856
复制相似问题