Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Date 使用批处理文件计算工作日_Date_Batch File_Command - Fatal编程技术网

Date 使用批处理文件计算工作日

Date 使用批处理文件计算工作日,date,batch-file,command,Date,Batch File,Command,我有一个非常简单的批处理文件,我正在尝试编写 如果今天是2013年3月,我希望我的批处理文件输出: 我会在2015年3月3日给你回电话 因此,它将采取的日期和增加2个工作日。因此,如果是2015年3月: 我会在19月3日给你回电话的。嗯,别担心,可以分批完成这里是我的一个实现~150行代码 实例 用法 做这样的事情来适应周末 if "%Date:~0,3%"=="Thu" call :DaysAhead 4 if "%Date:~0,3%&quo

我有一个非常简单的批处理文件,我正在尝试编写

如果今天是2013年3月,我希望我的批处理文件输出:

我会在2015年3月3日给你回电话

因此,它将采取的日期和增加2个工作日。因此,如果是2015年3月:


我会在19月3日给你回电话的。嗯,别担心,可以分批完成这里是我的一个实现~150行代码

实例 用法 做这样的事情来适应周末

if "%Date:~0,3%"=="Thu" call :DaysAhead 4
if "%Date:~0,3%"=="Fri" call :DaysAhead 4
if "%Date:~0,3%"=="Sat" call :DaysAhead 3
if "%Date:~0,3%"=="Sun" call :DaysAhead 2
if "%Date:~0,3%"=="Mon" call :DaysAhead 2
if "%Date:~0,3%"=="Tue" call :DaysAhead 2
if "%Date:~0,3%"=="Wed" call :DaysAhead 2

呃,别担心,可以分批做这里是我的一个实现~150行代码

实例 用法 做这样的事情来适应周末

if "%Date:~0,3%"=="Thu" call :DaysAhead 4
if "%Date:~0,3%"=="Fri" call :DaysAhead 4
if "%Date:~0,3%"=="Sat" call :DaysAhead 3
if "%Date:~0,3%"=="Sun" call :DaysAhead 2
if "%Date:~0,3%"=="Mon" call :DaysAhead 2
if "%Date:~0,3%"=="Tue" call :DaysAhead 2
if "%Date:~0,3%"=="Wed" call :DaysAhead 2

使用JScript来计算日期,你就成功了

@if (@X)==(@Y) @end /* (batch + jscript hybrid script init)

:: *** Batch script *****

@echo off
setlocal
for /f %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    echo I will call you back on %%I
)

goto :EOF

:: *** JScript script *****/
var dow = new Date().getDay();
var days = (dow > 4) ? 9 - dow : (dow == 4 ? 4 : 2);
var d = new Date(new Date().getTime() + (1000 * 60 * 60 * 24) * days);
WScript.echo((d.getMonth() + 1) + '/' + d.getDate());

如果今天是星期四,脚本将在下一个星期一返回。星期五到星期天,下一个星期二。星期一到星期三,两天前。你不必担心地点、闰年、蛙跳、月亮周期等等。

使用JScript计算日期,你就是黄金

@if (@X)==(@Y) @end /* (batch + jscript hybrid script init)

:: *** Batch script *****

@echo off
setlocal
for /f %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    echo I will call you back on %%I
)

goto :EOF

:: *** JScript script *****/
var dow = new Date().getDay();
var days = (dow > 4) ? 9 - dow : (dow == 4 ? 4 : 2);
var d = new Date(new Date().getTime() + (1000 * 60 * 60 * 24) * days);
WScript.echo((d.getMonth() + 1) + '/' + d.getDate());

如果今天是星期四,脚本将在下一个星期一返回。星期五到星期天,下一个星期二。星期一到星期三,两天前。而且你不必担心地点、闰年、蛙跳、月球周期等问题。

下面的批处理文件可以满足你的需要:

@echo off
rem AddBusinessDays.bat date numOfDays
rem Antonio Perez Ayala

rem Convert the date to Julian Day Number + number of days
for /F "tokens=1-3 delims=/" %%a in ("%1") do (
   set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c
)
set /A a=mm-14, jd=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075+2+%2, dow=jd%%7

rem Adjust Julian Day Number to avoid weekends
if %dow% lss 2 set /A jd+=2-dow

rem Convert Julian Day Number back to date
set /A l=jd+68569-2,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yy=100*(n-49)+i+l

rem Assemble the result
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%
set newDate=%mm%/%dd%/%yy%
echo %newDate%
参考:

例如:

>echo %date%
03/13/2013

>AddBusinessDays.bat %date% 2
03/15/2013

>AddBusinessDays.bat %date% 3
03/18/2013

>AddBusinessDays.bat %date% 4
03/18/2013

>AddBusinessDays.bat %date% 5
03/18/2013

>AddBusinessDays.bat %date% 6
03/19/2013
安东尼奥

PS-是的,我知道这种方法不会适用于世界上的每个人。好消息是,我并不是为所有人编写这个解决方案,而是为OP编写的,尽管为每台计算机修改它非常容易。例如,以前的程序在我的计算机中不起作用,因为我的语言环境是DD/MM/YYYY,但我可以在以前的程序的两行中交换DD和MM,我很确定这个世界上的大多数人也可以这样做-

嗨,安东尼奥, 就在今天,我发现你共享的代码在未来7天内都不起作用,我改变了一些东西,现在它一直在起作用

@echo off
rem AddBusinessDays.bat date numOfDays
rem adapted by Leonardo Contreras based on Antonio Perez Ayala with handling for more than 7 days

rem to convert Dow mm/dd/yyyy to mm/dd/yy
set mydate=%date:~4,2%/%date:~7,2%/%date:~10,4%

rem Convert the date to Julian Day Number + number of days
for /F "tokens=1-3 delims=/" %%a in ("%mydate%") do (
   set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c
)
rem dow_orig is based on a 0-6 days statrting on Monday
set /A a=mm-14, jd_orig = (1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075, dow_orig=jd_orig%%7

rem calculate new julian's day
set /A numw = (dow_orig+%3)/5, njd = jd_orig+%3+numw*2, dow=(njd)%%7 

rem Adjust Julian Day Number to avoid weekends
if %dow% gtr 5 (set /A jd+=2 )

rem Convert Julian Day Number back to date
set /A l=njd+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yy=100*(n-49)+i+l

rem Assemble the result
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%
set newDate=%mm%/%dd%/%yy%
echo %newDate%

下面的批处理文件执行您想要的操作:

@echo off
rem AddBusinessDays.bat date numOfDays
rem Antonio Perez Ayala

rem Convert the date to Julian Day Number + number of days
for /F "tokens=1-3 delims=/" %%a in ("%1") do (
   set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c
)
set /A a=mm-14, jd=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075+2+%2, dow=jd%%7

rem Adjust Julian Day Number to avoid weekends
if %dow% lss 2 set /A jd+=2-dow

rem Convert Julian Day Number back to date
set /A l=jd+68569-2,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yy=100*(n-49)+i+l

rem Assemble the result
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%
set newDate=%mm%/%dd%/%yy%
echo %newDate%
参考:

例如:

>echo %date%
03/13/2013

>AddBusinessDays.bat %date% 2
03/15/2013

>AddBusinessDays.bat %date% 3
03/18/2013

>AddBusinessDays.bat %date% 4
03/18/2013

>AddBusinessDays.bat %date% 5
03/18/2013

>AddBusinessDays.bat %date% 6
03/19/2013
安东尼奥

PS-是的,我知道这种方法不会适用于世界上的每个人。好消息是,我并不是为所有人编写这个解决方案,而是为OP编写的,尽管为每台计算机修改它非常容易。例如,以前的程序在我的计算机中不起作用,因为我的语言环境是DD/MM/YYYY,但我可以在以前的程序的两行中交换DD和MM,我很确定这个世界上的大多数人也可以这样做-

嗨,安东尼奥, 就在今天,我发现你共享的代码在未来7天内都不起作用,我改变了一些东西,现在它一直在起作用

@echo off
rem AddBusinessDays.bat date numOfDays
rem adapted by Leonardo Contreras based on Antonio Perez Ayala with handling for more than 7 days

rem to convert Dow mm/dd/yyyy to mm/dd/yy
set mydate=%date:~4,2%/%date:~7,2%/%date:~10,4%

rem Convert the date to Julian Day Number + number of days
for /F "tokens=1-3 delims=/" %%a in ("%mydate%") do (
   set /A mm=10%%a %% 100, dd=10%%b %% 100, yy=%%c
)
rem dow_orig is based on a 0-6 days statrting on Monday
set /A a=mm-14, jd_orig = (1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075, dow_orig=jd_orig%%7

rem calculate new julian's day
set /A numw = (dow_orig+%3)/5, njd = jd_orig+%3+numw*2, dow=(njd)%%7 

rem Adjust Julian Day Number to avoid weekends
if %dow% gtr 5 (set /A jd+=2 )

rem Convert Julian Day Number back to date
set /A l=njd+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yy=100*(n-49)+i+l

rem Assemble the result
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%
set newDate=%mm%/%dd%/%yy%
echo %newDate%

只是一条友好的建议:不要对批处理文件执行此操作。日期计算和操作在那里几乎是不可能的,需要非常小心和大量的代码。有没有办法在excel中这样做,然后让批处理文件调用输出?只是一条友好的建议:不要对批处理文件执行此操作。数据计算和操作在那里几乎是不可能的,需要非常小心和大量的代码。有没有办法在excel中这样做,然后让批处理文件调用输出?这对于其他区域设置是失败的。这正是我的意思,日期信息很难在批处理文件中正确获取。您可能应该从WMI获取日期。然后,0填充值上的set/a出现了问题,目前效果很好,但只要等到2013-04-09,它就会崩溃。@Joey-这正是我说可以实现的原因,下面是一个实现。我写了我的脚本,所以它可以很容易地调整。要求仅更改7%的日期%呼叫以支持不同的格式。此外,还修复了set/a问题:注意:我建议使用的JScript批处理混合答案,除非您需要纯批处理解决方案。对于其他区域设置,这将失败。这正是我的意思,日期信息很难在批处理文件中正确获取。您可能应该从WMI获取日期。然后,0填充值上的set/a出现了问题,目前效果很好,但只要等到2013-04-09,它就会崩溃。@Joey-这正是我说可以实现的原因,下面是一个实现。我写了我的脚本,所以它可以很容易地调整。要求仅更改7%的日期%呼叫以支持不同的格式。此外,还修复了set/a问题:注意:我建议使用的JScript批处理混合答案,除非您需要纯批处理解决方案。哈!我喜欢这种混合批处理和jscript的原创方式。我以前没见过+1:-@NateHekman-:我不能完全相信这一点。他是这方面的高手。我首先从他那里得到这个主意。看看他的剧本。它是一个混合的批处理+jscript脚本,其工作方式与sed类似。这给人留下了深刻的印象。@rojo:我可以为您的批处理JScript混合脚本建议一种不同的格式吗?在我看来,这种格式更清晰,你的方法可能会让人困惑
人们不知道*/结束批次部分并启动JScript代码。@ JB-如果您同意这样做,请考虑。谢谢哈我喜欢这种混合批处理和jscript的原创方式。我以前没见过+1:-@NateHekman-:我不能完全相信这一点。他是这方面的高手。我首先从他那里得到这个主意。看看他的剧本。它是一个混合的批处理+jscript脚本,其工作方式与sed类似。这给人留下了深刻的印象。@rojo:我可以为您的批处理JScript混合脚本建议一种不同的格式吗?在我看来,这种格式更清楚,你的方法可能会让那些不知道*/结束批次部分并启动JScript代码的人感到困惑。@ JB-如果你同意这样做的话,请考虑。谢谢!:O您可以在一次通话中安排多个工作分配?我从未注意到帮助文本中的表达式分隔符。:O您可以在一个集合/a调用中放置多个分配?我从未注意到帮助文本中的表达式分隔符。