FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WindowsServerで現在から1日前の日付をyymmdd形式で取り出すバッチ

はじめに書いておきますが、かなり長いのでがんばってください。
また、こちらの計算方法を得るにあたり様々なサイト様を閲覧したのですが、昔のことすぎて記録がありませんでした。。
参照した後、自分でも色々と手を入れているのですが、何かお気づきの点がございましたらコメントを頂ければと思います。申し訳ありません。


タイトル通りの計算結果を得たいと思ったため、そのバッチファイルを作りました。
その内容を記載し、説明します。

もうご存知かと思いますが、
 echo %date%
このコマンドをコマンドプロンプトに入れると下記のような結果が得られます。
 2015/05/12

echoは値を表示するためのコマンドで、%date%はWindowsの環境変数です。
要するに「echo %date%」は、「環境変数%date%の値を表示しろ」というコマンドなわけです。
この環境変数%date%を使って「1日前」を指定します。
様々なサイト様で記載があると思いますが、私はまず下記のように変数を設定しました。
set dt=%date%
set yy=%dt:~-10,4%
set y2=%dt:~2,2%
set mm=%dt:~5,2%
set dd=%dt:~8,2%


これで下記のような変数が出来上がりました。
 変数dt:環境変数%date%の値を代入
 変数yy:変数dtの1文字目から数えて4文字を取得
 変数y2:変数dtの3文字目から数えて2文字を取得
 変数mm:変数dtの6文字目から数えて2文字を取得
 変数dd:変数dtの9文字目から数えて2文字を取得

たとえば本日が2015/05/12であれば変数は下記のようになります。
 変数dt:2015/05/12
 変数yy:2015
 変数y2:15
 変数mm:05
 変数dd:12

さて、上記の例であれば、そのまま「y2+mm+dd」の「dd」部分の数値を1下げれば「アクセスログ名_150512」を取得できるわけですが、たとえば
 ① 2015年5月1日の前日は?
 ② 2015年1月1日の前日は?
 ③ 2016年3月1日などの閏年のときは?
などなど、例外が入ってくると、単純に「ys+mm+dd」の「dd」の数値を1下げればいいというわけにもいきません。

順に計算を説明します。
まずはじめに、ddの値から1引く計算をします。計算の結果、12日の場合はddの値は11になります。
set /a dd=%dd%-1

しかし、1日の場合はというと、01から1引くわけですから、0になってしまいます。すなわち2桁だったはずの値が1桁に桁落ちしてしまったわけです。これだと2桁の日付の値が取り出せません。ほしいのは、あくまで01、12、31などの2桁の数値です。
そこで、計算が終わったら、00と手前に0を2つ入れてやります。
変数ddの計算結果の値が0の場合は「000」に、1の場合は「001」に、11の場合は「0012」になります。
set dd=00%dd%

ここのddの値の後ろから2文字を取り出します。
set dd=%dd:~-2%

これで、日付から1引いた2桁の数値が取り出せました。

更にここで次の閏年計算のための変数ymodを追加します。
ここでは変数yyを4で割った際の余りの値を取り出します。もし余り0であれば閏年です。
set /a ymod=%yy% %% 4

さて、ここで何個かあった課題を思い出します。

 ① 2015年5月1日の前日は?
 ② 2015年1月1日の前日は?
 ③ 2016年3月1日などの閏年のときは?


たとえば①の場合、上記までの計算結果で変数ddは00になっていますが前日は30日です。また、月数を示す変数mmからも値を1引く必要があります。
②の場合は①と同様の問題のほかに変数y2からも値を1引かなければなりません。
③の場合はさらにさらに、4年に一度の2月29日の値を取り出す必要があります。

これを解決するのが下記です。
if %dd%==00 (
if %mm%==01 (set mm=12& set dd=31& if %y2%==00 (set y2=99) else (set /a y2=%y2%-1))
if %mm%==02 (set mm=01& set dd=31)
if %mm%==03 (set mm=02& set dd=28& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03& set dd=31)
if %mm%==05 (set mm=04& set dd=30)
if %mm%==06 (set mm=05& set dd=31)
if %mm%==07 (set mm=06& set dd=30)
if %mm%==08 (set mm=07& set dd=31)
if %mm%==09 (set mm=08& set dd=31)
if %mm%==10 (set mm=09& set dd=30)
if %mm%==11 (set mm=10& set dd=31)
if %mm%==12 (set mm=11& set dd=30)
)

順番に黄色の文字で説明すると、
if %dd%==00 (  
↑変数ddが00となっている場合、下記を実行する

if %mm%==01 (set mm=12& set dd=31& if %y2%==00 (set y2=99) else (set /a y2=%y2%-1))
↑変数mmが01、つまり1月1日の場合、変数mmには12、変数ddには31を代入します。
また、もし変数y2が00、つまり西暦2000年などの年だった場合は変数y2に99を指定、それ以外だった場合は変数y2から1を引く計算をします。

if %mm%==02 (set mm=01& set dd=31)
↑変数mmが02、つまり2月1日の場合、変数mmには01、変数ddには31を代入します。

if %mm%==03 (set mm=02& set dd=28& if %ymod%==0 (set dd=29))
↑変数mmが03、つまり3月1日の場合、変数mmには02、変数ddには28を代入します。ただし、もしも変数ymodが0、つまり閏年であった場合、ddには29の値を追加します。

if %mm%==04 (set mm=03& set dd=31)
↑変数mmが04、つまり4月1日の場合、変数mmには03、変数ddには31を代入します。

if %mm%==05 (set mm=04& set dd=30)
↑変数mmが05、つまり5月1日の場合、変数mmには04、変数ddには30を代入します。

if %mm%==06 (set mm=05& set dd=31)
↑変数mmが06、つまり6月1日の場合、変数mmには05、変数ddには31を代入します。

if %mm%==07 (set mm=06& set dd=30)
↑変数mmが07、つまり7月1日の場合、変数mmには06、変数ddには30を代入します。

if %mm%==08 (set mm=07& set dd=31)
↑変数mmが08、つまり8月1日の場合、変数mmには07、変数ddには31を代入します。

if %mm%==09 (set mm=08& set dd=31)
↑変数mmが09、つまり9月1日の場合、変数mmには08、変数ddには31を代入します。

if %mm%==10 (set mm=09& set dd=30)
↑変数mmが10、つまり10月1日の場合、変数mmには09、変数ddには30を代入します。

if %mm%==11 (set mm=10& set dd=31)
↑変数mmが11、つまり11月1日の場合、変数mmには10、変数ddには31を代入します。

if %mm%==12 (set mm=11& set dd=30)
↑変数mmが12、つまり12月1日の場合、変数mmには11、変数ddには30を代入します。

)

長かったですが、こんな感じで閏年対策、元日対策、月初対策が終わります。

次に、「まだあるの?」という感じですが、変数y2の値を計算した場合には変数ddのときと同様に桁落ちが発生する場合があります。
たとえば2009年の場合は09-1=8のようになってしまうわけです。
そこで、下記のように値を2桁に戻しておきます。
たとえば、もし変数y2が「1」なら「01」を代わりに代入する、というような処理をしています。
if %y2%==0 (set y2=00)
if %y2%==1 (set y2=01)
if %y2%==2 (set y2=02)
if %y2%==3 (set y2=03)
if %y2%==4 (set y2=04)
if %y2%==5 (set y2=05)
if %y2%==6 (set y2=06)
if %y2%==7 (set y2=07)
if %y2%==8 (set y2=08)
if %y2%==9 (set y2=09)


お疲れ様でした。あとは変数ystdyへ値を代入すればよいだけです。
たとえば、2015年5月12日の場合は変数ystdyは「150511」になります。
set ystdy=%y2%%mm%%dd%

最後に、今までの処理をまとめておきます。

set dt=%date%
set yy=%dt:~-10,4%
set y2=%dt:~2,2%
set mm=%dt:~5,2%
set dd=%dt:~8,2%

set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4

if %dd%==00 (
if %mm%==01 (set mm=12& set dd=31& if %y2%==00 (set y2=99) else (set /a y2=%y2%-1))
if %mm%==02 (set mm=01& set dd=31)
if %mm%==03 (set mm=02& set dd=28& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03& set dd=31)
if %mm%==05 (set mm=04& set dd=30)
if %mm%==06 (set mm=05& set dd=31)
if %mm%==07 (set mm=06& set dd=30)
if %mm%==08 (set mm=07& set dd=31)
if %mm%==09 (set mm=08& set dd=31)
if %mm%==10 (set mm=09& set dd=30)
if %mm%==11 (set mm=10& set dd=31)
if %mm%==12 (set mm=11& set dd=30)
)

if %y2%==0 (set y2=00)
if %y2%==1 (set y2=01)
if %y2%==2 (set y2=02)
if %y2%==3 (set y2=03)
if %y2%==4 (set y2=04)
if %y2%==5 (set y2=05)
if %y2%==6 (set y2=06)
if %y2%==7 (set y2=07)
if %y2%==8 (set y2=08)
if %y2%==9 (set y2=09)

set ystdy=%y2%%mm%%dd%
echo %ystdy%

以上です。
スポンサーサイト

Comment

(編集・削除用)
管理者にだけ表示を許可

Trackback

URL
http://tmgbl.blog.fc2.com/tb.php/30-e302f3d8
この記事にトラックバック(FC2Blog User)
Copyright © m
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。