使用算术运算符将时间转换为秒

Converting time to seconds using arithmetic operators

我正在尝试将文本文件中的时间值从 hr:min:sec.sec 转换为秒。我在每行的第 1 列中有一个包含事件编号(连续顺序、1、2、3 等)的文件,该行的其余部分是事件数据,如下面的示例所示。我想让用户输入两个数字,我的脚本用这两个数字获取每个事件的相应 hr:min:sec 并转换为仅秒数。

文件格式为 4 000-01:04:10.983745 34.56 string1 string_2(这将是第 4 行,其 date/time,以秒为单位的持续时间,以及接下来两列中的两个静态字符串。

我正在使用 for 循环获取标记 1、2 和 3,使用 : 作为 delims,然后只是为了执行算术而修剪字符串。

所以%%A应该是4 000-01%%B应该是04%%C应该是其他的都行。现在我刚刚读到 batch doesn't support decmials,所以如果需要我可以不用它们。但这没有返回任何东西:

setlocal enabledelayedexpansion enableextension

REM auto-setting event values for testing 
set begin=3 
set end=4

for /f "tokens=1,2,3 delims=:" %%A in ('findstr /b /c:"!begin![^0-9]" event.txt') do ( 
    set "hr=%%A" 
    set /A "min=%%B" 
    set "sec=%%C" 
    set /A "hr=!hr:~-2!" 
    set /A "sec=!sec:~0,2!" 
    set /A "total=(hr*3600)+(min*60)+sec" 
    echo !total!>>time.txt
)
exit /B

如果您的文件格式是:

line   4 000-01:04:10.983745 34.56 string1 string_2
delim       -  :  :  . 
token    1   2  3  4
var      -   A  B  C

避免前导 zero/octal 问题的常用技术是在前缀 两位小数,字面量为 1 并减去 100。 Set /A 允许在以逗号分隔的行上进行多次计算,变量不需要用百分号括起来(不适用于 for/arg 变量)。

@Echo off
setlocal enabledelayedexpansion enableextensions
for /f "tokens=2-4 delims=-:." %%A in (
  'findstr /b /C:"4 " event.txt'
) do Set /A "hr=1%%A-100,min=1%%B-100,sec=1%%C-100,total=hr*3600+min*60+sec"
echo Total is %total% (hr=%hr%, min=%min%, sec=%sec%)
echo %total% >>time.txt
exit /B

示例输出:

Total is 3850 (hr=1, min=4,sec=10)

这里有一种方法也考虑小数秒,四舍五入为六位小数:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=event.txt"
set "_TARGET=time.txt"
set "_REGEX=^[0-9][0-9]* [0-3][0-9][0-9]-[0-9][0-9]:[0-5][0-9]:[0-5][0-9].[0-9][0-9]* "

rem // Convert filtered lines:
> "%_TARGET%" (
    for /F "tokens=1-9* delims=:.- " %%A in ('findstr /R /C:"%_REGEX%" "%_SOURCE%"') do (
        rem // Extract and store hour, minute, second values:
        set "HOUR=1%%C" & set "MIN=1%%D" & set "SEC=1%%E"
        rem // Extract and store fractional seconds and also the static strings:
        set "FRAC=1%%F0000000" & set "STR1=%%I" & set "STR2=%%J"
        rem // Convert hour, minute, second values to decimal integers:
        set /A "HOUR%%=100, MIN%%=100, SEC%%=100"
        setlocal EnableDelayedExpansion
        rem // Convert fractional seconds to decimal number:
        set /A "FRAC=!FRAC:~,7!%%1000000+!FRAC:~7,1!/5"
        rem // Compute integer seconds, round to 6 decimal places:
        set /A "SEC+=60*(MIN+60*HOUR)+FRAC/1000000" & set "FRAC=000000!FRAC!"
        rem // Rebuilt line with time value replaced by fractional seconds:
        echo %%A %%B-!SEC!.!FRAC:~-6! %%G.%%H !STR1! !STR2!
        endlocal
    )
)

endlocal
exit /B