如何使用时钟命令计算Tcl中的时间跨度

时间:2017-06-05 10:24:45

标签: tcl

我需要使用Tcl计算24:00 hr格式时钟中一天两个时段之间的时差。

假设我的开始时间是早上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 + 5:30时区(IST)。

我如何得到确切的区别?

2 个答案:

答案 0 :(得分:1)

clock命令中没有任何内容可以将时间 interval 转换为人类可读的形式,因为它专注于处理时间 instants 。 / p>

你说的是你所在的时区导致时间间隔变得奇怪。通过-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

答案 1 :(得分: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