:: 月歷查詢工具 最初發(fā)表于CN-DOS
:: 原創(chuàng):foxjl 更新:namejm, qzwqzw,foxjl
:: 計算農(nóng)歷日期部分思路及算法來自"趣味東"
:: 輸入的日期格式為:年-月-日(-可以替換為:、/,可以混用)
:: 在日歷里面,★=當(dāng)天
:: 支持多種格式的日期輸入:
:: ① 若只輸入一個數(shù),則認為是查詢當(dāng)年月份,自動截取后兩位數(shù)字查詢,★標(biāo)在1日上;
:: ② 若輸入兩個數(shù),則認為是查詢年和月,★標(biāo)在1日上;
:: ③ 輸全的話,★標(biāo)在指定日期上
:: 關(guān)于年份的轉(zhuǎn)換:
:: ① 若年份上輸入的數(shù)字少于三位,則作如下轉(zhuǎn)換:
:: 50~99判定為19xx
:: 0~49判定為20xx
:: ② 若輸入的年份數(shù)字超過兩位,則截取后四位字符(不足部分在高位補0),
:: 按 ① 的規(guī)則計算該年份的日期;
:: 07-08-04 增加針對陽歷的生肖及干支年計算;修改錯誤日期循環(huán)提示的BUG.
:: 08-01-13 增加推算農(nóng)歷日期的功能,會有一天左右誤差。
@echo off
color 1f
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六七八九
set sdate=%date%
:Main
clsecho.
:: 日期提取、格式化與校驗
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 errorlevel 9167 goto Error
if %y% lss 100 (
if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
set sy=!y!
)
if %m% lss 13 if %d% lss 32 goto Calc
:Error
echo.錯誤的日期.
pause>nul
cd.
set sdate=%date%
goto Main
:Calc
::計算農(nóng)歷部分
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 sx=猴雞狗豬鼠?;⑼谬埳唏R羊
set tg=庚辛壬癸甲乙丙丁戊己
set dz=申酉戌亥子丑寅卯辰巳午未
set /a sxnum=%sy% %% 12
set /a tgnum=%sy:~-1%
title 農(nóng)歷!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 農(nóng)歷:%h%
:: 計算每個月的天數(shù)
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 計算2月份的偏差
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)
:: 計算指定日期的星期數(shù)
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
echo. %sy%年%sm%月 日期:%sy%-%sm%-%sd%,星期!str:~%w%,1!
echo.
:: 生成月歷
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
echo. 日 一 二 三 四 五 六
echo. ━━━━━━━━━━━━━━━━━━━
set /p= nul
for /l %%i in (0,1,37) do (
set "temp= "
if %%i GTR %wb% if %%i LSS %we% (
set temp= !day!
set temp=!temp:~-2!
if !d! EQU !day! set temp=★
set /a day+=1
)
set /p= !temp!nul
set /a "wm=(%%i+1)%%7"
if !wm! equ 0 echo.echo.set /p= nul
)
echo.
echo ━━━━━━━━━━━━━━━━━━━
echo. 輸入日期可查詢當(dāng)日星期并顯示當(dāng)月月歷
echo.
set sdate=
set /p sdate= 格式如:2007-02-03,[回車]退出:
if defined sdate goto Main
到此這篇關(guān)于批處理萬年歷實現(xiàn)代碼(包括農(nóng)歷日期)的文章就介紹到這了,更多相關(guān)批處理萬年歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!