我需要将时间以秒为单位转换为HH:MM:SS.mm
格式。正在从嵌入式设备读取秒输入,它是格式double
的{{1}}。我尝试了以下转换代码,但它失败了:
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"
我可以将double转换为整数,上面的方法也可以,但是输出显示中的毫秒数也很好。
此外,什么是时钟格式说明符,以毫秒为单位?
修改
似乎只将"ParseFormatArgs {*}$args"
(procedure "::tcl::clock::format" line 6)
转换为double
也不起作用。我试过了
int
它会导致一些奇怪的时间。例如,当嵌入式设备返回puts "[clock format [expr int($cpu_time)] -format {%H:%M:%S}]"
时(我将其转换为3.53
),打印出的时间为3
。
答案 0 :(得分:5)
格式化可靠工作的区间的最简单方法是手动完成所有操作。
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]
您可能希望将其包装在一个程序中......
答案 1 :(得分:3)
关于你的编辑,它以这种方式显示的原因(17:00:03)是时钟格式期望从纪元开始的整数秒。那么,我猜你距离UTC有五个时区?它将您的“3”解释为1970年1月1日午夜过后3秒,然后调整到您当地的时区。如果你只是将秒转换为格式(而不是实际的日期/时间到格式化的字符串),Donal的答案是最好的。如果将-gmt参数添加到已编辑的解决方案中,您将获得预期的00:00:03(然后您可以将“.53”毫秒的字符串附加到结果中以包括毫秒。
答案 2 :(得分:0)
答案 3 :(得分: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]
}