将秒转换为小时分钟秒格式

时间:2013-01-18 22:17:17

标签: tcl

我需要将时间以秒为单位转换为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

4 个答案:

答案 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)

毫秒的说明符是单个小s

尝试[时钟格式[时钟秒] - 格式“%H:%M:%S:%s”]

see this link

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