逆も出来ないと不便なので確認してみる。
年は、うるう年を含む日数が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 )