バッチファイルで日数を年月日に換算

逆も出来ないと不便なので確認してみる。
年は、うるう年を含む日数が400年ごと、100年ごと、4年ごとに一定になるので、それぞれ日数を計算しておくと、146097日ごとに400年、36524日ごとに100年、1461日ごとに4年、そして365日ごとに1年ってことが判る。ただ、36524日で割って100年が4回あると400年=うるう年、同様に365日で割って1年が4回あると4年=うるう年だから、1年を365日とした場合に1日多いうるう年をまたがってしまい、1年多い計算になるので、うるう年なら1年引いてやらないといけない。同様にうるう年なら1年に満たない日数に365日足してやらないといけない。
月は、153日ごとに5ヶ月、61日ごとに2ヶ月、31日ごとに1ヶ月ってことが判ってる。3月が基点になるので3を足せば元の月が求められる。ただ、13月と14月は翌年の1月と2月なので、それだけ直しておかないといけない。
日は1日から始まるので1を足せば元の日が求められる。
これをバッチファイルで書くとこんなカンジ。環境変数Sが日数。環境変数Y、M、Dに年、月、日が求められる。

SET /A YY=(%S%+305)/146097*400+(%S%+305)%%146097/36524*100-(%S%+305)%%146097/36524/4+(%S%+305)%%146097%%36524/1461*4+(%S%+305)%%146097%%36524%%1461/365-(%S%+305)%%146097%%36524%%1461/365/4
SET /A MM=((%S%+305)%%146097%%36524%%1461%%365+(%S%+305)%%146097/36524/4*365+(%S%+305)%%146097%%36524%%1461/365/4*365)/153*5+((%S%+305)%%146097%%36524%%1461%%365+(%S%+305)%%146097/36524/4*365+(%S%+305)%%146097%%36524%%1461/365/4*365)%%153/61*2+((%S%+305)%%146097%%36524%%1461%%365+(%S%+305)%%146097/36524/4*365+(%S%+305)%%146097%%36524%%1461/365/4*365)%%153%%61/31+3
SET /A DD=((%S%+305)%%146097%%36524%%1461%%365+(%S%+305)%%146097/36524/4*365+(%S%+305)%%146097%%36524%%1461/365/4*365)%%153%%61%%31+1
IF %MM% GTR 12 (
SET /A YY=%YY%+1
SET /A MM=%MM%-12
)

1行にまとめすぎてるので計算式を分けたものも書いてみた。

SET /A TA=%S%+305
SET /A TB=%TA%/146097
SET /A TC=%TA%%%146097
SET /A TD=%TC%/36524
SET /A TE=%TC%%%36524
SET /A TF=%TE%/1461
SET /A TG=%TE%%%1461
SET /A TH=%TG%/365
SET /A TI=%TG%%%365
SET /A TJ=%TD%/4
SET /A TK=%TH%/4
SET /A TL=%TI%+%TJ%*365+%TK%*365
SET /A TM=%TL%/153
SET /A TN=%TL%%%153
SET /A TO=%TN%/61
SET /A TP=%TN%%%61
SET /A TQ=%TP%/31
SET /A TR=%TP%%%31
SET /A YY=%TB%*400+%TD%*100-%TJ%+%TF%*4+%TH%-%TK%
SET /A MM=%TM%*5+%TO%*2+%TQ%+3
SET /A DD=%TR%+1
IF %MM% GTR 12 (
SET /A YY=%YY%+1
SET /A MM=%MM%-12
)