Batch file 如何在批处理命令中将12小时转换为24小时

Batch file 如何在批处理命令中将12小时转换为24小时,batch-file,batch-processing,batch-rename,Batch File,Batch Processing,Batch Rename,我是批处理命令的新手,最近我正在编写一个批处理脚本以获得文件更新时间 :GET_FILE_UPDATE_TIME rem **************************************** rem ** Get the modify time of the file rem **************************************** FOR %%f IN (%~1) DO SET filedatetime=%%~tf echo %~1 update tim

我是批处理命令的新手,最近我正在编写一个批处理脚本以获得文件更新时间

:GET_FILE_UPDATE_TIME

rem ****************************************
rem ** Get the modify time of the file
rem ****************************************
FOR %%f IN (%~1) DO SET filedatetime=%%~tf

echo %~1 update time :%filedatetime%>>%OUT_DIR%\%CORREL_LOG_UPDATE_TIME%.txt

rem Get the file update time
set filehour=%filedatetime:~11,2%

REM below is to remove the 0 from the time , eg. 09AM change into 9AM 
SET /a filehour=1!filehour!-(11!filehour!-1!filehour!)/10
set filemins=%filedatetime:~14,2%
SET /a filemins=1!filemins!-(11!filemins!-1!filemins!)/10
set /A filetime=(%filehour%*60*60)+(%filemins%*60)

goto:eof
起初我认为这个脚本很好用,但后来我发现它有一个bug。 有些文件返回12小时的时间格式,如follow

filedatetime=01/20/2014 07:12下午

或以下(适用于AM)

SET-filedatetime=21/01/2014 07:52

SET-filedatetime=01/21/2014 05:08 AM

当计算时,它变成了上午7:12,而实际上是下午19:12


有谁能帮我解决这个问题吗?

通过更改变量名等,您应该能够相当轻松地将其合并到代码中

set time=07:12 PM

if "%time%"=="%time:AM=%" set /a t=%time:~0,2%+12

if defined t set time=%t%%time:~2%

echo %time%

给定一个遵循约定的变量
00:00 AM
/
PM
,这将检查时间是否为AM,如果不是AM,则将转换为24小时时间。

编辑-在需要解析时,日期输出中的本地化通常会导致噩梦。添加了尝试清理日期和时间的代码。没有,没有防弹,我无法访问所有可能的本地化来测试它。可能需要进行一些调整

@echo off

    setlocal enableextensions

    for %%f in ("%~f0") do call :get24HDateTime "%%~tf" dt 
    echo %dt%

    call :get24HDateTime "%date% 01:00 AM"
    call :get24HDateTime "%date% 01:00 PM"
    call :get24HDateTime "%date% 00:00 AM"
    call :get24HDateTime "%date% 23:00"
    call :get24HDateTime "%date% 07:00"

    endlocal

exit /b

:get24HDateTime "inputDateTime" outputVariable
    setlocal enableextensions enabledelayedexpansion
    set "input=%~1"
    set "DT="
    for /f "tokens=*" %%a in ('cmd /d /q /e:on /c "for %%f in ("%input: =" "%") do echo(%%~f"^|findstr /r /b /e /c:"[0-9/.-]*" /c:"[0-9][0-9]:[0-9][0-9]" /c:"[AP]M"') do (
        set "DT=!DT! %%~a"
    )
    for /f "tokens=1-6 delims=A/: " %%a in ("%DT:PM= PM%") do (
        if not "%%f"=="PM" ( set "H=%%d" ) else ( set /a "H=(1%%d %% 100)+12" )
        set "DT=%%a/%%b/%%c !H!:%%e"
    )
    endlocal & if not "%~2"=="" ( set "%~2=%DT%" ) else echo(%DT%
    exit /b
@ECHO关闭
SETLOCAL
对于%%x英寸(“01/20/2014 07:12”“01/20/2014 3:22”“01/20/2014 17:12”“21/01/2014 07:52”“01/21/2014 05:08”),请执行以下操作(
设置“filedatetime=%%~x”
电话:gfutq
调用ECHO生成%%filedatetime%%和filetime=%filetime%%和filetimez=%filetimez%%
设置“filedatetime=%%~x AM”
电话:gfutq
调用ECHO生成%%filedatetime%%和filetime=%filetime%%和filetimez=%filetimez%%
设置“filedatetime=%%~x PM”
电话:gfutq
调用ECHO生成%%filedatetime%%和filetime=%filetime%%和filetimez=%filetimez%%
)
后藤:EOF
:获取\u文件\u更新\u时间
雷姆****************************************
rem**获取文件的修改时间
雷姆****************************************
对于(%1)中的%%f,请设置filedatetime=%%~tf
echo%~1更新时间:%filedatetime%>%OUT\u DIR%\%CORREL\u LOG\u update\u time%.txt
:gfutq
回显原始filedatetime=%filedatetime%
设置“filetimez=”
设置“f1224=”
::首先-最后两个字符是“AM”还是“PM”?
如果“%filedatetime:~-2%”=AM集/a f1224=0
如果“%filedatetime:~-2%”=PM集/a f1224=12
如果已定义F1224,请设置“filedatetime=%filedatetime:~0,-3%”
::最后2个字符=分钟,十进制
set/a filemins=1%filedatetime:~-2%-100
设置“filedatetime=%filedatetime:~0,-3%”
::最后2个字符=小时
设置“filehour=%filedatetime:~-2%”
设置“filedatetime=%filedatetime:~0,-2%”
设置“filedatetime=%filedatetime:=%”
::确保前导空格为0(在前导零抑制的情况下)
::在结果前面加上1,然后减去100,得到十进制小时数
set/a filehour=1%filehour:=0%-100
::找不到后缀?
如果未定义F1224转到GFUTN
::使用12小时时钟;如果12:??做0:??然后加0或12
如果%filehour%gtr 12设置filetime=没有意义&转到:EOF
如果%filehour%==12(设置/a filehour=%f1224%),则其他(设置/a filehour+=%f1224%)
如果%filehour%gtr 24 SET filetime=没有意义&GOTO:EOF
:gfutns
设置/A文件时间=(%filehour%*60*60)+(%filemins%*60)
设置filemins=0%filemins%
设置filehour=0%filehour%
设置filetimez=%filehour:~-2%%filemins:~-2%
后藤:eof
这里有一个小演示,可以处理所有的情况

我武断地将时间13:??+定义为如果后跟
AM
PM
,则没有意义

返回的数字是午夜计算后的秒数和零填充的hhmm。返回
filedatetime
,并删除时间元素


请注意,由于我已根据测试值设置了所需的日期时间字符串,因此我使用的是不同的例程项。

谢谢。这在下午时看起来有效,但在上午时,它仍然会增加12个小时,C:\Users\abc>C:\Temp\test.bat C:\Users\abc>设置时间=10:12 PM C:\Users\abc>如果“10:12 PM”==“10:12 PM”set/a t=10+12 C:\Users\abc>如果定义t set time=22:12 PM C:\Users\abc>echo 22:12 PM 22:12 PM C:\Users\abc>C:\Temp\test.bat C:\Users\abc>设置时间=10:12 AM C:\Users\abc>如果“10:12 AM”=“10:12“set/a t=10+12 C:\Users\abc>如果定义t set time=22:12 AM C:\Users\abc>echo 22:12 AM 22:12 AM抱歉,但是当set filedatetime=21/01/2014 07:52这样的测试用例时仍然出现问题,这意味着另一个问题-晚上8点和晚上9点的时间将失败:08+12将产生错误,因为08将被解释为八进制。谢谢MC。但是对于call:get24HDateTime“%date%01:00pm”它仍然不起作用,它仍然返回01,而我们希望它返回13@user3221750,你检查过没有读错行吗?对我来说,它返回的是13而不是01。这很奇怪,我复制的脚本与您的脚本完全相同,没有任何更改,我得到了以下返回值C:\Users\abc>C:\Temp\test.bat 2014/01/23周四:01 2014/01/23 周四:01 2014/01/23 周四:00 2014/01/23 周四:23 2014/01/23 周四:07@user3221750,您的%date%变量似乎包括工作日。我已将答案更新为“处理”。但可能你必须调整它。