我需要使用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)。
我如何得到确切的区别?
答案 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