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 であるため、以前のプログラムは私のコンピューターでは動作しませんddが、以前のプログラムの 2 行でandを交換することはでき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%
于 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());

今日が木曜日の場合、スクリプトは次の月曜日を返します。金曜日から日曜日、次の火曜日。2 日前の月曜日から水曜日。また、ロケール、うるう年、うるうカエル、月の周期などを気にする必要はありません。

于 2013-03-13T16:07:34.663 に答える