2

我需要以秒为单位将时间转换为HH:MM:SS.mm格式。秒输入是从嵌入式设备中读取的double,格式为seconds.millseconds. 我尝试了以下转换代码,但失败了:

set cpu_time [function_that_fetches_the_time]
puts "[clock format $cpu_time -format {%H:%M:%S}]"

这失败并出现错误

expected integer but got "98.92"

从抛出

"ParseFormatArgs {*}$args"
    (procedure "::tcl::clock::format" line 6)

我可以将双精度转换为整数,上面的方法可以工作,但在输出显示中也有毫秒部分会很好。

另外,毫秒的时钟格式说明符是什么?

编辑:

似乎仅将其转换doubleint也不起作用。我试过了

puts "[clock format [expr int($cpu_time)] -format {%H:%M:%S}]"

这会导致一些奇怪的时间。例如,当嵌入式设备返回3.53(我将其转换为 a 3)时,打印出来的时间是17:00:03.

4

4 回答 4

6

格式化可靠工作的间隔的最简单方法是手动完成所有操作。

set cpu_time [function_that_fetches_the_time]
set cpu_ms   [expr { int(fmod($cpu_time, 1.0) * 1000) }]
set cpu_secs [expr { int(floor($cpu_time)) % 60 }]
set cpu_hrs  [expr { int(floor($cpu_time / 3600)) }]
set cpu_mins [expr { int(floor($cpu_time / 60)) % 60 }]
puts [format "%d:%02d:%02d.%3d" $cpu_hrs $cpu_mins $cpu_secs $cpu_ms]

您可能希望将其包含在一个过程中……</p>

于 2013-01-18T23:25:18.350 回答
3

关于您的编辑,它以这种方式显示的原因(17:00:03)是时钟格式期望从纪元开始的整数秒。所以,我猜你离 UTC 有五个时区?它将您的“3”解释为 1970 年 1 月 1 日午夜过后 3 秒,然后调整到您当地的时区。如果您只是将秒数转换为格式(而不是将实际日期/时间转换为格式化字符串),Donal 的答案是最好的。如果将 -gmt 参数添加到已编辑的解决方案中,您将获得预期的 00:00:03(然后您可以将“.53”毫秒字符串附加到结果中以包括毫秒。

于 2013-01-18T23:30:45.227 回答
0

一毫秒的说明符是一个小 s

尝试 [时钟格式 [时钟秒数] -format "%H:%M:%S:%s"]

看到这个链接

于 2013-01-18T22:26:56.047 回答
0

这是我修改Donal Fellows答案的方法,这对某些人来说可能会更好一些,因为它对我有用。

proc time_cmd {cmd} {
    set start [clock milliseconds]
    eval $cmd
    set end [clock milliseconds]
    set runtime [expr $end - $start]
    set seconds [expr $runtime / 1000]
    set cpu_ms [expr $runtime % 1000]    
    set cpu_secs [expr { int(floor($seconds)) % 60 }]
    set cpu_mins [expr { int(floor($seconds / 60)) % 60 }]
    set cpu_hrs  [expr { int(floor($seconds / 3600)) }]
    puts [format "Command completed in %d:%02d:%02d.%-03d" $cpu_hrs $cpu_mins $cpu_secs $cpu_ms]
}
于 2020-08-08T05:17:11.853 回答