- @ECHO off
- setlocal
- chcp 437>nul&&graftabl 936>nul 2>nul|| SET err=3&&GOTO :err
- ::先以 H2B 函数还原成长度为 18 的字符串,其定义如下:
- ::前12个字节代表1-12月:1为大月,0为小月;压缩成十六进制(1-3位)
- ::第13位为闰月的情况,1为大月30天,0为小月29天;(4位)
- ::第14位为闰月的月份,如果不是闰月为0,否则给出月份(5位)
- ::最后4位为当年农历新年的公历日期,如0131代表1月31日;当作数值转十六进制(6-7位)
- ::农历常量(1899~2100,共202年)
- ::公历转农历模块
- ::
- ::数据来源:阿勇 2005/1/12
- ::// 农历数据定义 //
- :::::尊重他人劳动成果,请保留以上信息:::::
- ::批处理完成:Yovie ver:3.3 20080119
- SET ylData0=AB500D2,4BD0883,
- SET ylData1=4AE00DB,A5700D0,54D0581,D2600D8,D9500CC,655147D,56A00D5,9AD00CA,55D027A,4AE00D2,
- SET ylData1=%ylData1%,A5B0682,A4D00DA,D2500CE,D25157E,B5500D6,56A00CC,ADA027B,95B00D3,49717C9,49B00DC
- SET ylData2=A4B00D0,B4B0580,6A500D8,6D400CD,AB5147C,2B600D5,95700CA,52F027B,49700D2,6560682,
- SET ylData2=%ylData2%,D4A00D9,EA500CE,6A9157E,5AD00D6,2B600CC,86E137C,92E00D3,C8D1783,C9500DB,D4A00D0
- SET ylData3=D8A167F,B5500D7,56A00CD,A5B147D,25D00D5,92D00CA,D2B027A,A9500D2,B550781,6CA00D9,
- SET ylData3=%ylData3%,B5500CE,535157F,4DA00D6,A5B00CB,457037C,52B00D4,A9A0883,E9500DA,6AA00D0,AEA0680
- SET ylData4=AB500D7,4B600CD,AAE047D,A5700D5,52600CA,F260379,D9500D1,5B50782,56A00D9,96D00CE,
- SET ylData4=%ylData4%,4DD057F,4AD00D7,A4D00CB,D4D047B,D2500D3,D550883,B5400DA,B6A00CF,95A1680,95B00D8
- SET ylData5=49B00CD,A97047D,A4B00D5,B270ACA,6A500DC,6D400D1,AF40681,AB600D9,93700CE,4AF057F,
- SET ylData5=%ylData5%,49700D7,64B00CC,74A037B,EA500D2,6B50883,5AC00DB,AB600CF,96D0580,92E00D8,C9600CD
- SET ylData6=D95047C,D4A00D4,DA500C9,755027A,56A00D1,ABB0781,25D00DA,92D00CF,CAB057E,A9500D6,
- SET ylData6=%ylData6%,B4A00CB,BAA047B,B5500D2,55D0983,4BA00DB,A5B00D0,5171680,52B00D8,A9300CD,795047D
- SET ylData7=6AA00D4,AD500C9,5B5027A,4B600D2,96E0681,A4E00D9,D2600CE,EA6057E,D5300D5,5AA00CB,
- SET ylData7=%ylData7%,76A037B,96D00D3,4AB0B83,4AD00DB,A4D00D0,D0B1680,D2500D7,D5200CC,DD4057C,B5A00D4
- SET ylData8=56D00C9,55B027A,49B00D2,A570782,A4B00D9,AA500CE,B25157E,6D200D6,ADA00CA,4B6137B,
- SET ylData8=%ylData8%,93700D3,49F08C9,49700DB,64B00D0,68A1680,EA500D7,6AA00CC,A6C147C,AAE00D4,92E00CA
- SET ylData9=D2E0379,C9600D1,D550781,D4A00D9,DA400CD,5D5057E,56A00D6,A6C00CB,55D047B,52D00D3,
- SET ylData9=%ylData9%,A9B0883,A9500DB,B4A00CF,B6A067F,AD500D7,55A00CD,ABA047C,A5A00D4,52B00CA,B27037A
- SET ylData10=69300D1,7330781,6AA00D9,AD500CE,4B5157E,4B600D6,A5700CB,54E047C,D1600D2,E960882,
- SET ylData10=%ylData10%,D5200DA,DAA00CF,6AA167F,56D00D7,4AE00CD,A9D047D,A2D00D4,D1500C9,F250279,D5200D1
- SET ylMd0=初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十
- SET ylMn0=正二三四五六七八九十冬腊
- SET ylTianGan0=甲乙丙丁戊已庚辛壬癸
- SET ylDiZhi0=子丑寅卯辰巳午未申酉戌亥
- SET ylShu0=鼠牛虎兔龙蛇马羊猴鸡狗猪
- SET festData=正初一,正初二,正初三,正十五,五初五,七初七,八十五,九初九,腊初八,腊三十,保留
- SET fest=春节,春节,春节,元宵,端午,七夕,中秋,重阳,腊八,除夕
- set solarTerm=小寒大寒立春雨水惊蛰春分清明谷雨立夏小满芒种夏至小暑大暑立秋处暑白露秋分寒露霜降立冬小雪大雪冬至
- set sTermInfo=0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758,525949
- SET jieqinian=525948
- SET jieqinianyu=766245
- SET xiaohanstart=1900-01-06
- SET timestart=0205
- SET fs= <nul
- ::从屏幕得到公历年月日
- ::没有错误检测
- :getdate
- SETLOCAL Enabledelayedexpansion
- TITLE 批处理版农历日期查询
- cls
- SET gldate=<nul
- SET /p gldate=请输入公历的日期,如(20080808),为空则为今日:
- if "%gldate%"=="" SET gldate=%date:~0,4%%date:~5,2%%date:~8,2%&&SET now=%time:~0,2%
- if /i "%gldate%"=="Q" GOTO :eof
- ::计算年份
- SET glyear=%gldate:~0,4%
- SET year=%glyear%
- if %glyear% lss 1901 SET err=1&&GOTO :err
- if %glyear% gtr 2100 SET err=1&&GOTO :err
- ::得到月份
- SET glmon=%gldate:~4,2%
- if %glmon% lss 01 SET err=2&&GOTO :err
- if %glmon% gtr 12 SET err=2&&GOTO :err
- ::得到日期
- SET gltday=%gldate:~6%
- if %gltday% lss 01 SET err=2&&GOTO :err
- if %gltday% gtr 31 SET err=2&&GOTO :err
- SET glmd=%glmon%%gltday%
- GOTO :gettable
- :gettable
- ::计算是表中的第几位
- SET /a nlyear=glyear-1900
- SET /a nly=nlyear%%20
- if %nly% equ 0 SET nly=20
- set /a nllast=nly-1
- SET /a nl=(nlyear-1)/20+1
- if %nllast% == 0 (SET nllast=20&&SET /a nllasty=nl-1) else (
- SET nllasty=%nl%
- )
- ::得到该位的数据
- for /f "tokens=%nly% delims=," %%a in ("!ylData%nl%!") do SET thisData=%%a
- for /f "tokens=%nllast% delims=," %%a in ("!ylData%nllasty%!") do SET lastData=%%a
- if not defined lastData SET lastData=4BD0883
- ::取出第四位,看闰月的天数
- :start
- SET leapd=%thisData:~3,1%
- if %leapd%==1 (SET leapday=30) else SET leapday=29
- ::取出第五位,看是否闰月
- SET isleap=%thisData:~4,1%
- SET isleap=%isleap:A=10%
- SET isleap=%isleap:B=11%
- SET isleap=%isleap:C=12%
- SET /a isleap-=1
- :H2B
- ::SET hStr=0123456789ABCDEF
- SET bStr=0000000100100011010001010110011110001001101010111100110111101111
- SET hStr=0 1 2 3 4 5 6 7 8 9 A B C D E F
- SET n=0
- for %%i in (%hStr%) do (
- CALL SET x%%i=%%bStr:~!n!,4%%
- SET /a n+=4
- )
- CALL :gethead3
- GOTO :getlast2
- ::取得前三位
- :gethead3
- for /l %%i in (0,1,2) do (
- SET mon=!thisData:~%%i,1!
- CALL SET month%%i=%%x!mon!%%
- )
- SET month=%month0%%month1%%month2%
- for /l %%i in (0,1,11) do SET month%%i=!month:~%%i,1!
- GOTO :eof
- ::取得最后两位并转化为十进制
- :getlast2
- SET /a A=10,B=11,C=12,D=13,E=14,F=15
- CALL SET newy1=%%!thisData:~5,1!%%
- if "%newy1%"=="" SET newy1=!thisData:~5,1!
- CALL :h2d %newy1%
- SET /a newy1=no*16
- CALL SET newy2=%%!thisData:~6,1!%%
- if "%newy2%"=="" SET newy2=!thisData:~6,1!
- CALL :h2d %newy2%
- SET /a newy=newy1+no
- SET newy=0%newy%
- SET newy2=%newy:~-4,2%
- SET newy1=%newy:~-2%
- :days
- ::计算公历天数之差,由于自己的算法不够通用::
- ::因此采用他人算法::
- CALL :Date2Day %glyear%-%glmon%-%gltday% sdays
- CALL :Date2Day %glyear%-%newy2%-%newy1% tdays
- SET /a days=sdays-tdays
- if !days! lss 0 (
- SET before=1
- SET mc=11,-1,0
- SET days=!days:-=!
- SET thisData=%lastData%
- CALL :gethead3
- ) else (
- SET mc=0,1,11
- )
- :out
- SET yltian=0
- SET glmon= <nul
- for /l %%i in (%mc%) do (
- SET m=%%i
- SET n=!month%%i!
- SET /a yltian+=29+n
- if !yltian! gtr %days% GOTO :next
- if %%i == %isleap% (
- SET /a yltian+=leapday
- if !yltian! gtr %days% SET glmon=闰&&GOTO :next
- )
- )
- SET err=2&&GOTO :err
- ::计算干支
- :next
- CALL :jieqi jieqi
- if !jq! gtr 3 (GOTO xxx)
- if not defined lichun (SET /a glyear-=1) else (
- if defined before SET /a m+=1,m%%=12
- )
- :xxx
- SET /a tiangan=(glyear-4)%%10
- SET /a dizhi=(glyear-4)%%12
- SET ganzhi=!ylTianGan0:~%tiangan%,1!!ylDiZhi0:~%dizhi%,1!
- ::计算生肖
- SET shuxiang=!ylShu0:~%dizhi%,1!
- :getmon
- ::计算月份
- CALL SET glmon=!glmon!%%ylMn0:~!m!,1%%
- SET /a yue=((tiangan%%5+1)*2%%10+m)%%10
- SET /a fen=(2+m)%%12
- SET yuefen=!ylTianGan0:~%yue%,1!!ylDiZhi0:~%fen%,1!
- ::计算日子
- CALL SET x=%%month!m!%%
- if "%glmon:~0,1%"=="闰" SET x=%leapd%&&SET run=1
- SET /a gldat=(29+x-(yltian-days))*2
- if defined before SET /a gldat=-gldat
- if %x%==0 SET ylMd0=%ylMd0:~0,-2%
- CALL SET gldat=%%ylMd0:~!gldat!,2%%
- SET /a year-=1900
- SET xiuzheng=0
- SET xiuzhengzhi=1,2,0,1,1,2,2,3,4,4,5,5
- SET glyue=%glmd:~0,-2%
- if "%glyue%" lss "1" SET glyue=%glyue:~-1%
- for /f "tokens=%glyue% delims=," %%i in ("%xiuzhengzhi%") do SET xiuzheng=%%i
- SET /a leap="(^!(year%%4))&(^!(glyue/3))"
- SET /a ri=year*5+year/4+9+gltday+(glyue-1)%%2*30
- SET /a qi=(ri-leap+xiuzheng)%%60-1
- SET /a qigan=qi%%10
- SET /a qizhi=qi%%12
- SET riqi=!ylTianGan0:~%qigan%,1!!ylDiZhi0:~%qizhi%,1!
- ::若为今日则计算时辰
- SET shijian= <nul
- if not defined now GOTO :fest
- SET /a jian=(now+1)/2%%12
- SET /a shi=(qigan%%5*2+jian)%%10
- SET shijian=!ylTianGan0:~%shi%,1!!ylDiZhi0:~%jian%,1!时
- ::计算节日
- :fest
- if defined jieqi (
- SET /a jieqi*=2
- CALL SET fs=%%solarTerm:~!jieqi!,2%%
- )
- if not "%fs%"==" " SET shijian=%fs% <nul&&SET "fs= "
- if defined run GOTO :workout
- SET gl=%glmon:~-1%%gldat%
- SET n=0
- for %%i in (%festData%) do (
- SET /a n+=1
- if "%gl%"=="%%i" GOTO :countf
- )
- :countf
- if [%n%]==[11] (
- if "%gl%"=="腊廿九" if %x%==0 SET fs=除夕
- GOTO :workout
- )
- for /f "tokens=%n% delims=," %%i in ("%fest%") do SET fs=%%i
- ::最后结果
- :workout
- SET head=%ganzhi%(%shuxiang%)年%glmon%月%gldat%
- SET tail=%yuefen%月%riqi%日┋%shijian%
- ECHO ┏━━━━━━━━━━┳━━┳━━━━━━━━━━┓
- ECHO ┃%head%┃%fs%┃%tail%┃
- ECHO ┗━━━━━━━━━━┻━━┻━━━━━━━━━━┛
- GOTO :end
- :h2d
- SET no=%1
- for %%i in (A B C D E F) do if %1 equ %%i SET no=!%%i!
- GOTO :eof
- ::错误
- :err
- if %err%==1 ECHO 对不起,暂不支持!
- if %err%==2 ECHO 对不起,日期有误!
- if %err%==3 ECHO Sorry,your Operation System is unsupportted!&ENDLOCAL&GOTO :EXIT
- :end
- ENDLOCAL
- PAUSE>nul
- GOTO :getdate
- :EXIT
- ping -n 3 127.1>nul
- ENDLOCAL
- GOTO :eof
- :jieqi
- ::24节气采用近似算法,可能会有误差
- ::但是2008年的节气已经验证没有错误.
- CALL :Date2Day %xiaohanstart% sdays
- SET thisyear=%gldate:~0,4%-%gldate:~4,2%-%gldate:~6,2%
- CALL :Date2Day %thisyear% tdays
- SET /a tdays-=sdays
- SET /a min=tdays*1440+125
- SET /a min+=min/63871
- SET /a Nnian=min/jieqinian
- SET /a minjie=Nnian*jieqinianyu/1000000+Nnian*jieqinian
- SET /a minjie=min-minjie
- if !minjie! geq 41850 (SET lichun=1)
- SET jq=0
- SET temp=0
- for %%i in (%sTermInfo%) do (
- SET tmp=%%i
- if !minjie! leq %%i if !minjie! geq !temp! GOTO :jieqiyes
- SET temp=%%i
- SET /a jq+=1
- )
- :jieqiyes
- SET /a jq%%=24
- SET /a jie=minjie-temp
- if %jie% lss 0 (
- SET jie=%jie:-=%
- if !jie! leq 125 (
- SET /a jq-=1&&SET %1=!jq!&&GOTO :eof
- )
- ) else (
- if !jie! leq 1315 (
- SET /a jq-=1&&SET %1=!jq!&&GOTO :eof
- )
- )
- SET /a jie=minjie-tmp
- if %jie% lss 0 (
- SET jie=%jie:-=%
- if !jie! leq 125 (
- SET %1=!jq!&&GOTO :eof
- )
- ) else (
- if !jie! leq 1315 (
- SET %1=!jq!&&GOTO :eof
- )
- )
- GOTO :eof
- :Date2Day
- ::算法:Ritchie Lawrence, updated 2002-08-13. Version 1.1.
- setlocal ENABLEEXTENSIONS
- for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (
- set yy=%%a & set mm=%%b & set dd=%%c
- )
- set /a dd=100%dd%%%100,mm=100%mm%%%100
- set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
- set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
- endlocal&set %2=%j%&goto :EOF
- :Day2Date
- ::暂时不使用
- setlocal ENABLEEXTENSIONS
- set /a i=%1,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
- set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
- set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
- (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
- endlocal&set %2=%yy%-%mm%-%dd%&goto :EOF
Yovie发表于: 2008-01-26 13:06 |
|