昨日の続き

昨日も書きましたが、以下のソースは、こちら(→http://homepage1.nifty.com/jak/batch/jdate.html)からの転載です。(コメント部分のみ若干修正しました)

d2jd.bat

@echo off
REM ------------------------------------------------ d2jd.bat
REM 日付をジュリアンデートへ変換(2008/04/02 --> 93 2008-93)
REM 引数%1はYYYY/MM/DD形式、なしは本日

if "%1"=="" (
    for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a
) else (
    set orgdate=%1
)

:年月日の分割
set yy=%orgdate:~0,4%
set mm=%orgdate:~5,2%
set dd=%orgdate:~8,2%
:月日の
set /a mm=1%mm%-100
set /a dd=1%dd%-100

:月(MM)→通算日
set /a jd=(mm-1)*31
echo set sub=-003344555667 >sub.bat
echo set /a jd=jd-%%sub:~%mm%,1%% >>sub.bat
call sub.bat

:閏年処理
:4で割り切れるか?
  set /a u=yy %% 4
  if not %u%==0 goto ddadd
:100で割り切れて、400で割り切れないか?
  set /a u=yy %% 400
  set /a v=yy %% 100
  if %v%==0 if not %u%==0 goto ddadd
:2月を越えているか?
  if %mm% LEQ 2 goto ddadd

set /a jd = jd + 1

:ddadd
:通算日に日(DD)を加える
set /a jd=jd+dd
set jdyyyy=%yy%-%jd%

echo %jd% %jdyyyy%
:後処理
del sub.bat

こういうとこ(「echo set sub=-003344555667 >sub.bat」「echo set /a jd=jd-%%sub:~%mm%,1%% >>sub.bat」)なんて魔法のようです。なにをやってるんだろ。

jd2d.bat

@echo off
REM ------------------------------------------------ jd2d.bat
REM ジュリアンデートを日付へ変換(93 2008 --> 2008/04/02)
REM 引数%1は DDD [YYYY] 形式、結果は環境変数dtへ返す。なしはダメ

:引数評価
if "%1"=="" goto usage 
set jd=%1

:年指定チェック
if "%2"=="" if "%yy%"=="" goto GetYear 
if not "%2"=="" set yy=%2
if %yy% GEQ 1990 goto OK

:GetYear
:年の取得
  set yy=%date:~0,4%
:OK
:Julian Date 範囲のチェック
if %jd% LEQ   0 goto usage

:閏年処理
:4で割り切れるか?
  set /a u=yy %% 4
  if not %u%==0 goto L1
:100で割り切れて、400で割り切れないか?
  set /a u=yy %% 400
  set /a v=yy %% 100
  if %v%==0 if not %u%==0 goto L1
  if %jd% GTR 366 goto usage
  goto L2

:L1
  if %jd% GTR 365 goto usage
:L2

:環境変数の待避
set orgjd=%jd%
set orgyy=%yy%

set m=12
:LOOP
  set tmpm=0%m%
  set tmpm=%tmpm:~-2%
  call d2jd %orgyy%/%tmpm%/01 > nul
  if %jd% LEQ %orgjd% goto break
  set /a m=m-1
goto LOOP
:break

set /a d=orgjd - jd + 1
set mm=0%m%
set mm=%mm:~-2%
set dd=0%d%
set dd=%dd:~-2%
set dt=%orgyy%/%mm%/%dd%
echo %dt%
goto end

:usage
echo usege: Julian Date to Date
echo jd2d DDD [YYYY]
echo  DDD  -- Julian Date
echo  YYYY -- Year

:end

参考

再度書いておきますが、こちら(→http://homepage1.nifty.com/jak/batch/jdate.html)がオリジナルです。ありがとうございました。