以前折腾过一个计算农历的BAT,后来被我整合到我私家的批处理工具箱里!
----------原版本:生肖,甲子,星期,农历---------- setlocal enabledelayedexpansion
- set str=日一二三四五六七八九
- set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
- set tg=庚辛壬癸甲乙丙丁戊己
- set dz=申酉戌亥子丑寅卯辰巳午未
- set sdate=%date%
- for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do ((set sy=%%i) && (set sm=%%j) && (set sd=%%k))
- if not defined sd set sd=1
- if not defined sm set sm=%sy%&set sy=%date:~0,4%
- (set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
- (set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
- set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
- if %y% lss 100 ( if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
- set sy=!y!)
- set/a Q=(y-1901)/4
- set/a R=y-1901-4*Q
- set n=0
- for %%i in (0,31,59,90,120,151,181,212,243,273,304,334) do (set /a n+=1
- if %m% equ !n! set z=%%i)
- set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
- if %m% gtr 2 (if %leap% equ 0 (set /a z-=1) else (set /a z+=leap))
- set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=(140*Q+106*(R+1)+z*10+d*10-295*n)/10
- if %h% equ 0 set h=29
- if %h% leq 10 (if %h% equ 10 (set h=初十) else (set h=初%h%)) else (set h=%h:~0,1%十%h:~-1%号)
- for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%)
- set h=%h:0=%
- set /a sxnum=%sy% %% 12
- set /a tgnum=%sy:~-1%
- title 日期:%sy%-%sm%-%sd% 星期!str:~%w%,1! !tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 农历:%h%
- set days=31
- for %%i in (4 6 9 11) do if %m% equ %%i set days=30
- set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
- if %m% equ 2 set /a days=28+%leap%
- if %m% leq 2 (set /a y-=1& set /a m+=12)
- set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
- echo. 日期:%sy%-%sm%-%sd% 星期!str:~%w%,1! !tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 农历:%h%
- pause>nul
复制代码 由于我的个人原因,鄙人写BAT 不喜欢开启 延迟变量,,
--------下是被我修改过的无“延迟变量”版本,农历计算部分的计算代码---------
后来我把代码修改了,,,改成,,,,,,,,,,,- Set/a y=1%date:~0,4%-10000, m=1%date:~5,2%-100, d=1%date:~8,2%-100
- Set/a Q=(y-1901)/4
- Set/a R=y-1901-4*Q
- If %m%==1 Set z=0
- If %m%==2 Set z=31
- If %m%==3 Set z=59
- If %m%==4 Set z=90
- If %m%==5 Set z=120
- If %m%==6 Set z=151
- If %m%==7 Set z=181
- If %m%==8 Set z=212
- If %m%==9 Set z=243
- If %m%==10 Set z=273
- If %m%==11 Set z=304
- If %m%==12 Set z=334
- Set/a leap="!(y%%4) & !(y%%100) | !(y%%400)"
- If %m% gtr 2 (If %leap% equ 0 (Set/a z-=1) else (Set/a z+=leap))
- Set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=(140*Q+106*(R+1)+z*10+d*10-295*n)/10
- If %h% equ 0 Set h=29
- If %h% leq 10 (If %h% equ 10 (Set h=初十) else (Set h=初%h%)) else (Set h=%h:~0,1%十%h:~-1%号)
- Set h=%h:1=一%
- Set h=%h:2=二%
- Set h=%h:3=三%
- Set h=%h:4=四%
- Set h=%h:5=五%
- Set h=%h:6=六%
- Set h=%h:7=七%
- Set h=%h:8=八%
- Set h=%h:9=九%
- Set h=%h:0=%
- Set 农历=%h%
- echo.日期:%DATE%
- echo.农历:%农历%
- pause>nul
复制代码 以前使用的时候农历计算都基本能对得上,,,,
最后一次对的上农历是在上个月没过年前 农历十六号吧!,,
原版本(带延迟变量)和鄙人修改的(无延迟变量)版本都对得上,,
但是昨天发现农历少了一天,,,,
可能早就出现错误了,(公历2月换3月?或春节过后?)但是昨天才发现,,,,,
顺着计算公式查了半天,没弄明白是啥回事,,,
有大神们知道是啥情况不?讨论讨论呗,,,,
几年前用的时候基本都对得上啊!为什么就在这个2月份一过就出错了呢?折腾了好久也没弄明白,,。。
后来只有硬修改,把,Set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=(140*Q+106*(R+1)+z*10+d*10-295*n)/10
核心计算公式,,,,硬桥硬码的加了个,,,
Set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=((140*Q+106*(R+1)+z*10+d*10-295*n)/10)+1,,,修正值(也可以是个变量数),,,
农历是对得上了,,,可疑问依然纯在,,
之前问了不少A1,可他们给的答案都,,可能是没案例,没法完美解答吧,,,
或许是鄙人问的方法不对?,,各位出来讨论讨论呗。。。!
------------------------------------------------------------------
鄙人的私家批处理工具箱,重达 380多K,,里面塞满了,各种奇奇怪怪稀奇古怪的脚本和代码,有混编VBS,JS,HTA,Ps的,生成小程序的,也有折腾注册表的,加密解密,计算优化的各种各类都有,(调用第三方的也有,不计算在内),,
由于我写的主脚本,会多次重新调用各种标签和外调计算,也会在注册表和右键那里调用主脚本的计算公式或内里代码,,
开启“延迟变量”,会在各种标签跳跃和调用间出错和表达出错,符号出错,,所以,我写脚本的时候会尽量避开“延迟变量”,,,
我最常调用主脚本的功能有,截图折腾,换算折腾,文件折腾,系统折腾,服务折腾,右键折腾,加密折腾,资料折腾,,,各种折,各种腾,,,
心态老了,就只折腾这些怀旧代码,把“工具箱”一扔到U盘里,基本WIN PC 上很多疑难和设置都能搞定一半,现在只堆自己的小“工具箱”,,,, |