您好,登錄后才能下訂單哦!
這篇文章主要介紹了計算機中批處理如何實現萬年日歷,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
核心源碼
:: 月歷查詢工具 最初發表于CN-DOS :: 原創:foxjl 更新:namejm, qzwqzw,foxjl :: 計算農歷日期部分思路及算法來自"趣味東" :: 輸入的日期格式為:年-月-日(-可以替換為:、/,可以混用) :: 在日歷里面,★=當天 :: 支持多種格式的日期輸入: :: ① 若只輸入一個數,則認為是查詢當年月份,自動截取后兩位數字查詢,★標在1日上; :: ② 若輸入兩個數,則認為是查詢年和月,★標在1日上; :: ③ 輸全的話,★標在指定日期上 :: 關于年份的轉換: :: ① 若年份上輸入的數字少于三位,則作如下轉換: :: 50~99判定為19xx :: 0~49判定為20xx :: ② 若輸入的年份數字超過兩位,則截取后四位字符(不足部分在高位補0), :: 按 ① 的規則計算該年份的日期; :: 07-08-04 增加針對陽歷的生肖及干支年計算;修改錯誤日期循環提示的BUG. :: 08-01-13 增加推算農歷日期的功能,會有一天左右誤差。 @echo off color 1f mode con cols=40 lines=20 setlocal enabledelayedexpansion set str=日一二三四五六七八九 set sdate=%date% :Main cls&echo. :: 日期提取、格式化與校驗 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 ::計算農歷部分 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=猴雞狗豬鼠牛虎兔龍蛇馬羊 set tg=庚辛壬癸甲乙丙丁戊己 set dz=申酉戌亥子丑寅卯辰巳午未 set /a sxnum=%sy% %% 12 set /a tgnum=%sy:~-1% title 農歷!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 :: 計算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) :: 計算指定日期的星期數 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. 輸入日期可查詢當日星期并顯示當月月歷 echo. set sdate= set /p sdate= 格式如:2007-02-03,[回車]退出: if defined sdate goto Main
以下是各計算部分算法:
計算星期:
基姆拉爾森計算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數+1,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,
例:如果是2004-1-10則換算成:2003-13-10來代入公式計算。
生肖及干支年計算方法是:
出生公元年數÷12,然后根據除得的商的余數,對照生肖排列就馬上可以知道。
生肖排列是:猴(0)、雞(1)、狗(2)、豬(3)、鼠(4)、牛(5)、虎(6)、兔(7)、龍(8)、蛇(9)、馬(10)、羊(11)。
天干地支算法:
首先要能記住十大天干和十二地支,
十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;
十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;
天干地支紀年法首先是天干在前,地支在后,比如今年2005就為-乙酉年,先來算算天干,有個公式:
4、 5、 6、 7、 8、 9、 0、 1、 2、 3 對應的十天干就是
甲、乙、丙、丁、戊、己、庚、辛、壬、癸,
數字為年代的最后的一位數字,比如今年是2005,最后一位是5,對應的天干就是乙;
地支的算法:用年代數除以12,后面的余數就代表某個地支,余數分別為:
4、 5、 6、 7、 8、 9、 10、 11、 0、 1、 2、 3,
代表地支為:子、丑、寅、卯、辰、巳、午、 未、 申、酉、戌、亥,
比如2005年為例:年代末尾數為5,對應的天干為乙,2005除以12,余數為1,對應的地支為酉,所以2005年為乙酉年。
農歷日期部分的算法是:
陰歷日期是以月亮的圓缺為計月單位,其以逢朔為初一,以月望為十五(大月為十六日),以月晦為二十 九日(大月為三十日)。然而目前記時通常用陽歷日期表達,如欲將陽歷日期換算成陰歷日期可以用以下兩種方法:其一是查《新編萬年歷》,如查1984年6月8日是陰歷幾日?翻開萬年歷6月10日是陰歷十一,則逆推6月8日是陰歷初九。其二可以利用公式推算陰歷日期:
設:公元年數-1977(或1901)=4Q+R
則:陰歷日期=14Q+10.6(R+1)+年內日期序數-29.5n
(注:式中Q、R、n均為自然數,R<4)
例:1994年5月7日的陰歷日期為:
1994-1977=17=4×4+1
故:Q=4,R=1 則:5月7日的陰歷日期為:
14×4+10.6(1+1)+(31+28+31+30+7)-29.5n
=204.2- 29.5n
然后用29.5去除204.2得商數6......27.2,6即是n值,余數27即是陰歷二十七日。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“計算機中批處理如何實現萬年日歷”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。