TGDZCalc by Windows Batch file

学了那么多语言来写这个函数,甚至连Bash都去试了下,却忘记了用批处理也是可以的。 赶紧加上。

点击查看代码
@echo off
set /p input=请输入开始年份:
set /a startY=%input%
set/p   input=请输入结尾年份:
set /a endY=%input%

:cycle
if %startY% GTR %endY% goto Exit

REM 计算BaseYear,存入变量b

set /a y=%startY%
if  %y% gtr 0 (set /a b=4) else (set /a b=-57)

:loop1
if %b% gtr %y% (set /a b-=60
goto loop1 ) 

:loop2
set /a tmpb=%b%+60
if %tmpb% leq %y% (
set /a b+=60
goto loop2)
REM GetBaseYear结束,变量b代表结果
 
REM 计算天干地支,存入变量tgdz
set /a y=%startY%
if %y% gtr 0 (set /a y-=4) else (set /a y-=3)

:loop3
if %y% lss 0 (
set /a y+=60
goto loop3
)
set /a ti=y%%10
set /a di=y%%12
REM 因为批处理中截取字符串不能(会?)用变量,故用此丑陋的方法变通一下。
if %ti%==0 (set  tg=甲)
if %ti%==1 (set  tg=乙)
if %ti%==2 (set  tg=丙)
if %ti%==3 (set  tg=丁)
if %ti%==4 (set  tg=戊)
if %ti%==5 (set  tg=己)
if %ti%==6 (set  tg=庚)
if %ti%==7 (set  tg=辛)
if %ti%==8 (set  tg=壬)
if %ti%==9 (set  tg=癸)

if %di%==0 (set  dz=子)
if %di%==1 (set  dz=丑)
if %di%==2 (set  dz=寅)
if %di%==3 (set  dz=卯)
if %di%==4 (set  dz=辰)
if %di%==5 (set  dz=巳)
if %di%==6 (set  dz=午)
if %di%==7 (set  dz=未)
if %di%==8 (set  dz=申)
if %di%==9 (set  dz=酉)
if %di%==10 (set  dz=戌)
if %di%==11 (set  dz=亥)
set tgdz=%tg%%dz%

REM 根据天干地支和BaseYear,返算年份year
set tg2=%tgdz:~0,1%
set dz2=%tgdz:~1,1%
if %tg2%==甲 (set /a tmpTi=0)
if %tg2%==乙 (set /a tmpTi=1)
if %tg2%==丙 (set /a tmpTi=2)
if %tg2%==丁 (set /a tmpTi=3)
if %tg2%==戊 (set /a tmpTi=4)
if %tg2%==己 (set /a tmpTi=5)
if %tg2%==庚 (set /a tmpTi=6)
if %tg2%==辛 (set /a tmpTi=7)
if %tg2%==壬 (set /a tmpTi=8)
if %tg2%==癸 (set /a tmpTi=9)

if %dz2%==子 (set /a tmpDi=0)
if %dz2%==丑 (set /a tmpDi=1)
if %dz2%==寅 (set /a tmpDi=2)
if %dz2%==卯 (set /a tmpDi=3)
if %dz2%==辰 (set /a tmpDi=4)
if %dz2%==巳 (set /a tmpDi=5)
if %dz2%==午 (set /a tmpDi=6)
if %dz2%==未 (set /a tmpDi=7)
if %dz2%==申 (set /a tmpDi=8)
if %dz2%==酉 (set /a tmpDi=9)
if %dz2%==戌 (set /a tmpDi=10)
if %dz2%==亥 (set /a tmpDi=11)

if %tmpTi% geq %tmpDi% (set /a m=tmpTi-tmpDi) else (set /a m=12+tmpTi-tmpDi)
set /a year=b+ m*5 + tmpTi

REM 显示结果
echo %startY%  %tgdz% 甲子元年:%b% %year%

set /a startY+=1
goto cycle

:Exit
pause

批处理文件用来写这个确实有点不合适,如果不用外部命令协助的话,这可能几乎是能力边缘了。--连个类似substr的函数或indexof函数都没有.

posted @ 2025-05-30 22:41  dingxianghuan  阅读(19)  评论(0)    收藏  举报