[INDEX] [TOP]

バッチファイルで日付の操作(2)

ここでは、Windows2000/XP のコマンドプロンプトでの日付処理行うバッチファイルを紹介します。

日付をジュリアンデートに変換
ジュリアンデートを日付に変換
本日のn日前の日付を求める(1週間前、30日前など)

日付をジュリアンデートに変換

(本日の)日付をジュリアンデートに変換するバッチファイルです。ここでのジュリアンデートは、その年の1月1日からの通算日です。たとえば、2003/12/31 は 2003-365 となります。バッチファイル名は d2jd.bat としました。


@echo off
REM --------------------------------------------- d2jd.bat
REM 日付からジュリアンデートへの変換
REM 日付はYYYY/MM/DD 形式とする。結果は環境変数へ返す。
REM 引数がないときは本日とする。
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

ジュリアンデートを日付に変換

ジュリアンデートを通常の日付(YYYY/MM/DD)に変換するバッチファイルです。ここでのジュリアンデートは、先ほどと同じようにその年の1月1日からの通算日です。たとえば、2003/12/31 は 2003-365 となりますが、引数としては、jd2d 365 2003 として引き渡します。バッチファイル名は jd2d.bat としました。


@echo off
REM --------------------------------------------- jd2d.bat
REM Julian Dateから日付への変換
REM Julian Dateは DDD [YYYY] 形式とする。結果は環境変数dtへ返す。
REM 引数がないときは環境変数 jd と yy を確認し、存在しなければ使用方法を表示する

:引数評価
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

本日のn日前の日付を求める

実行日のn日前の日付を計算するバッチファイルです。引数に求めたい日数を指定します。
 このバッチは、前述の日付をジュリアンデートに変換するバッチファイル d2jd.bat と、ジュリアンデートを日付に変換するバッチファイル jd2d.bat を呼び出してもとめるので、両方のバッチがこのバッチと同じディレクトリ(フォルダ)に必要です。
 ジュリアンデートを使う2つのバッチを呼び出すおかげで、この back.bat は大変シンプルに仕上がりました。環境変数がたくさん残るのがお作法が悪いですが(^^)

 このバッチの流れは、次の通りです。


@echo off
REM --------------------------------------------- back.bat
REM n日前の日付を求める
REM 引数に求めたい日数を指定する。結果は環境変数dtへ返す。
if "%1"=="" goto exit
call d2jd %2 >nul
set /a jd=jd-%1

:LOOP
if %jd% GTR 0 goto recover
   set jdans=%jd%
   set /a yy=yy-1
   call d2jd %yy%/12/31 > nul
   set /a jd= jdans + jd
   goto LOOP

:recover
   call jd2d %jd% %yy% > nul
   echo %dt%
:exit


バッチファイルで日付関係の操作(1)へ戻る
counter
Copyright (c) 2003-2007 じゃく
last update:2003-10-24