Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 计算批处理文件中两个日期(DD/MM/YYYY HH:MM:SS)之间的持续时间_Batch File - Fatal编程技术网

Batch file 计算批处理文件中两个日期(DD/MM/YYYY HH:MM:SS)之间的持续时间

Batch file 计算批处理文件中两个日期(DD/MM/YYYY HH:MM:SS)之间的持续时间,batch-file,Batch File,我想计算以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 heure

我想计算以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

关于如何在批处理文件中实现这些转换,有很多示例。然而,这些方法中的大多数都是简陋的

我开发了一种非常有效的方法来获取两次之间经过的秒数,但我从未完成过获取两次日期之间经过的天数的等效有效方法。这就是:

@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%

您可以在以下链接查看有关此程序的更多信息:时间部分的有效转换方法在中介绍,JulianDayNumber-to-Date转换方法在中介绍,批量定义“函数”的方法在中介绍。

这是一个通用的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
日期格式必须具有零填充值(可能是您描述的值),此方法才能工作

如果日期的格式与您的系统区域设置相匹配(我假定您在欧洲或加拿大),则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
SETLOCAL
设置“日期1=25/06/2018 13:18:25”
设置“日期2=26/06/2018 09:57:59”

PowerShell-NoProfile-ExecutionPolicy Bypass-Command“((获取日期“%DATE2%”)-获取日期“%DATE1%”)。ToString()我建议使用PowerShell,它有内置的日期函数,而Windows command processor没有。但是,您可以在堆栈溢出上找到随时可用的代码,以确定两个日期之间的时间差。您只需搜索它。请查看在中找到的结果的示例。查看,否则,我将第二次使用PowerShell for t这是一个通用的解决方案,cmd很难做到。你必须在闰日和当地夏时制等方面做所有的傻事。
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