1

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

如果今天是 03/13,我希望我的批处理文件输出:

“我会在 03/15 给你回电话”

因此需要日期并添加 2 个工作日。因此,如果是 03/15:

“我会在 03/19 给你回电话”

4

3 回答 3

2

下面的批处理文件做你想做的事:

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

参考:http ://www.hermetic.ch/cal_stud/jdn.htm#comp

例如:

>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,但是我可以在以前的程序的两行中互换ddmm我很确定这个世界上的大多数人也有能力这样做! ;-)

嗨安东尼奥,就在今天,我发现您共享的代码提前 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%
于 2013-03-13T17:36:39.013 回答
2

嗯,别着急,可以分批完成的。:) 这是我的一个实现(约 150 行代码)。

例子

https://gist.github.com/DavidRuhmann/4666270

用法

做这样的事情来适应周末。

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
于 2013-03-13T15:00:03.527 回答
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());

如果今天是星期四,脚本将返回下一个星期一。周五至周日,下周二。周一到周三,提前两天。而且您不必担心语言环境、闰年、闰年、农历周期等。

于 2013-03-13T16:07:34.663 回答