我想计算以DD / MM / YYYY HH:MM:SS为格式的两个日期之间的持续时间:
echo Jours;Mois;Année;hh;mm;JoursF;MoisF;AnnéeF;hhF;mmF;Duration>Duration.csv
REM ====Découper la date en jours, mois et années ==
SET AA1=2018
SET MM1=01
SET JJ1=01
REM REM ====Découper l'heures en heures, Minutes, Secondes ==
SET hh1=01
SET mmm1=20
REM =====saisie deux
REM ====Découper la date en jours, mois et années ==
SET AA2=2019
SET MM2=02
SET JJ2=03
REM ====Découper l'heures en heures, Minutes, Secondes ==
SET hh2=02
SET mmm2=5
REM==== statement condition
IF %AA2% EQU %AA1% IF %MM2% EQU %MM1% IF %JJ2% EQU %JJ1% IF %hh2% EQU %hh1%
IF %mmm2% GTR %mmm1% set /a duration = %mmm2%-%mmm1%
REM===== display duration
Echo %JJ1%;%MM1%;%AA1%;%hh1%;%mmm1%;%JJ2%;%MM2%;%AA2%;%hh2%;%mmm2%;%duration% >>Duration.csv
答案 0 :(得分:1)
关于如何在批处理文件中实现这些转换的例子很多。但是,这些方法大多数都是基本的和粗糙的。
我开发了一种非常有效的方法来获取两次之间的经过时间,但我从未完成过等效的高效方法来获取两次日期之间的经过时间。所以这里是:
@echo off
setlocal EnableDelayedExpansion
rem Get elapsed days/time between two timestamps in "DD/MM/YYYY HH:MM:SS" format
rem Antonio Perez Ayala aka Aacini
rem Define the "Date in DDMMYYYY format" To "Julian Day Number" conversion "function"
set "DateToJDN(Date)=( a=1Date, y=a%%10000, a/=10000, m=a%%100, d=a/100-100, a=(m-14)/12, (1461*(y+4800+a))/4+(367*(m-2-12*a))/12-(3*((y+4900+a)/100))/4+d-32075 )"
echo Enter two timestamps in "DD/MM/YYYY HH:MM:SS" format
set /P "stamp1=Enter start timestamp: "
set /P "stamp2=Enter end timestamp: "
for /F "tokens=1-4" %%a in ("%stamp1% %stamp2%") do set "date1=%%a" & set "time1=%%b" & set "date2=%%c" & set "time2=%%d"
set /A "days=!DateToJDN(Date):Date=%date2:/=%! - !DateToJDN(Date):Date=%date1:/=%!"
set /A "ss=(((1%time2::=-100)*60+1%-100) - (((1%time1::=-100)*60+1%-100)"
if %ss% lss 0 set /A "ss+=60*60*24, days-=1"
set /A "hh=ss/3600+100, ss%%=3600, mm=ss/60+100, ss=ss%%60+100"
echo/
echo Duration: %days% days and %hh:~1%:%mm:~1%:%ss:~1%
您可以在以下链接上查看有关该程序的更多信息:this answer中介绍了时间部分的有效转换方法,this reply中介绍了JulianDayNumber到Date的转换方法,以及方法在this thread中描述了在批处理中定义“功能”的方法。
答案 1 :(得分:0)
这是通用的PowerShell解决方案(从批处理文件调用-在任何Windows操作系统上均应工作)。您没有说经过时间应采用哪种格式,所以这是一个概念证明。
SETLOCAL
SET "DATE1=25/06/2018 13:18:25"
SET "DATE2=26/06/2018 09:57:59"
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "((Get-Date -Year %DATE1:~6,4% -Month %DATE1:~3,2% -Day %DATE1:~0,2% -Hour %DATE1:~11,2% -Minute %DATE1:~14,2% -Second %DATE1:~17,2%) - (Get-Date -Year %DATE2:~6,4% -Month %DATE2:~3,2% -Day %DATE2:~0,2% -Hour %DATE2:~11,2% -Minute %DATE2:~14,2% -Second %DATE2:~17,2%)).ToString()" <NUL
这产生
20:39:33.9995000
日期格式必须必须具有零填充值(可能是您所描述的值),此方法才能起作用。
如果日期的格式与您的系统区域设置相匹配(我假设您在欧洲或加拿大),则可以大大简化PowerShell命令,从而使Windows可以为您进行所有解析。在这种情况下,零填充不再是必需的。
SETLOCAL
SET "DATE1=25/06/2018 13:18:25"
SET "DATE2=26/06/2018 09:57:59"
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "((Get-Date '%DATE2%') - (Get-Date '%DATE1%')).ToString()" <NUL
如果您希望将经过时间用秒,分钟,小时或天的十进制数表示,则可以使用.TotalSeconds
(或.TotalMinutes
,.TotalHours
或{{ 1}}),而不是TotalDays
。
我认为日期库是完成这项工作的正确工具。 CMD只能执行整数算术,而其他大多数逻辑都是痛苦的。如果可以将工作简化为简单的算术(在这方面@aacini的解决方案很不错),那么它可能还不错。否则,不要重新发明轮子。