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

如何使用时钟命令计算Tcl中的时间跨度,tcl,Tcl,我需要使用Tcl计算24:00小时格式时钟中一天两个时段之间的时差 假设我的开始时间是早上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 ]

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

假设我的开始时间是早上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的时差会被加到时差中,因为我在格林尼治时间+5:30的时区(IST)


如何获得确切的差异?

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]
}

我不明白你为什么不使用-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

非常感谢你。。。这帮了大忙:-)我应该提到,这是理想的日子,而不是真实的日子,因此不考虑DST变化等复杂性。间隔处理(就像与时间有关的一切)比乍一看要困难。嗨。。谢谢你的建议。显然“-timezone UTC”的工作原理与Donal引用的“-gmt 1”类似。“gmt+1”或“UTC+2”对我来说是因为我的TZ是CEST。对你来说呢?我设置了我的UNIX机器(对不起,我没有机会在Windows机器上设置)并查看结果:$sudo systemsetup-gettimezone timezone:Asia/Kolkata。与上面相同命令的结果:morn=1496710800偶数=1496754000 diff=1970:01:01 17:30:00 difference=43200 with-timezone UTC=12:00:00
morn = 1496723400
even = 1496766600
diff = 1970:01:01 13:00:00
difference = 43200
with -timezone UTC = 12:00:00