佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 批處理萬(wàn)年歷實(shí)現(xiàn)代碼(包括農(nóng)歷日期)

批處理萬(wàn)年歷實(shí)現(xiàn)代碼(包括農(nóng)歷日期)

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 鐵路電話系統(tǒng) 美圖手機(jī) 網(wǎng)站文章發(fā)布 服務(wù)器配置 銀行業(yè)務(wù) 智能手機(jī) 檢查注冊(cè)表項(xiàng)

核心源碼

:: 月歷查詢工具 最初發(fā)表于CN-DOS
:: 原創(chuàng):foxjl 更新:namejm, qzwqzw,foxjl
:: 計(jì)算農(nóng)歷日期部分思路及算法來(lái)自"趣味東"
:: 輸入的日期格式為:年-月-日(-可以替換為:、/,可以混用)
:: 在日歷里面,★=當(dāng)天
:: 支持多種格式的日期輸入:
:: ① 若只輸入一個(gè)數(shù),則認(rèn)為是查詢當(dāng)年月份,自動(dòng)截取后兩位數(shù)字查詢,★標(biāo)在1日上;
:: ② 若輸入兩個(gè)數(shù),則認(rèn)為是查詢年和月,★標(biāo)在1日上;
:: ③ 輸全的話,★標(biāo)在指定日期上 
:: 關(guān)于年份的轉(zhuǎn)換:
:: ① 若年份上輸入的數(shù)字少于三位,則作如下轉(zhuǎn)換: 
::   50~99判定為19xx
::   0~49判定為20xx
:: ② 若輸入的年份數(shù)字超過(guò)兩位,則截取后四位字符(不足部分在高位補(bǔ)0),
::  按 ① 的規(guī)則計(jì)算該年份的日期; 
:: 07-08-04 增加針對(duì)陽(yáng)歷的生肖及干支年計(jì)算;修改錯(cuò)誤日期循環(huán)提示的BUG.
:: 08-01-13 增加推算農(nóng)歷日期的功能,會(huì)有一天左右誤差。
@echo off
color 1f
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六七八九
set sdate=%date%
:Main
clsecho.
:: 日期提取、格式化與校驗(yàn)
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.錯(cuò)誤的日期.
pause>nul
cd.
set sdate=%date%
goto Main
:Calc
::計(jì)算農(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%號(hào))
for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%)
set h=%h:0=%
:: 計(jì)算生肖及干支年
set sx=猴雞狗豬鼠牛虎兔龍蛇馬羊
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%
:: 計(jì)算每個(gè)月的天數(shù)
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 計(jì)算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)
:: 計(jì)算指定日期的星期數(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

以下是各計(jì)算部分算法:

計(jì)算星期:
基姆拉爾森計(jì)算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數(shù)+1,m表示月份數(shù),y表示年數(shù)。
注意:在公式中有個(gè)與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,
例:如果是2004-1-10則換算成:2003-13-10來(lái)代入公式計(jì)算。

生肖及干支年計(jì)算方法是:

出生公元年數(shù)÷12,然后根據(jù)除得的商的余數(shù),對(duì)照生肖排列就馬上可以知道。
生肖排列是:猴(0)、雞(1)、狗(2)、豬(3)、鼠(4)、牛(5)、虎(6)、兔(7)、龍(8)、蛇(9)、馬(10)、羊(11)。

天干地支算法:
首先要能記住十大天干和十二地支,
十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;
十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;
天干地支紀(jì)年法首先是天干在前,地支在后,比如今年2005就為-乙酉年,先來(lái)算算天干,有個(gè)公式:
4、 5、 6、 7、 8、 9、 0、 1、 2、 3 對(duì)應(yīng)的十天干就是
甲、乙、丙、丁、戊、己、庚、辛、壬、癸,
數(shù)字為年代的最后的一位數(shù)字,比如今年是2005,最后一位是5,對(duì)應(yīng)的天干就是乙;
地支的算法:用年代數(shù)除以12,后面的余數(shù)就代表某個(gè)地支,余數(shù)分別為:
4、 5、 6、 7、 8、 9、 10、 11、 0、 1、 2、 3,
代表地支為:子、丑、寅、卯、辰、巳、午、 未、 申、酉、戌、亥,
比如2005年為例:年代末尾數(shù)為5,對(duì)應(yīng)的天干為乙,2005除以12,余數(shù)為1,對(duì)應(yīng)的地支為酉,所以2005年為乙酉年。

農(nóng)歷日期部分的算法是:
陰歷日期是以月亮的圓缺為計(jì)月單位,其以逢朔為初一,以月望為十五(大月為十六日),以月晦為二十 九日(大月為三十日)。然而目前記時(shí)通常用陽(yáng)歷日期表達(dá),如欲將陽(yáng)歷日期換算成陰歷日期可以用以下兩種方法:其一是查《新編萬(wàn)年歷》,如查1984年6月8日是陰歷幾日?翻開萬(wàn)年歷6月10日是陰歷十一,則逆推6月8日是陰歷初九。其二可以利用公式推算陰歷日期:
設(shè):公元年數(shù)-1977(或1901)=4Q+R
則:陰歷日期=14Q+10.6(R+1)+年內(nèi)日期序數(shù)-29.5n
(注:式中Q、R、n均為自然數(shù),R4)
例: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得商數(shù)6......27.2,6即是n值,余數(shù)27即是陰歷二十七日。

到此這篇關(guān)于批處理萬(wàn)年歷實(shí)現(xiàn)代碼(包括農(nóng)歷日期)的文章就介紹到這了,更多相關(guān)批處理萬(wàn)年歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:長(zhǎng)治 紅河 樂山 沈陽(yáng) 上海 滄州 河南 新疆

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《批處理萬(wàn)年歷實(shí)現(xiàn)代碼(包括農(nóng)歷日期)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    遵义市| 铁岭县| 灌南县| 曲周县| 张家口市| 阳江市| 方正县| 三门县| 灵武市| 兰考县| 平阳县| 石棉县| 朝阳区| 施甸县| 武山县| 长汀县| 从江县| 清徐县| 洛隆县| 咸阳市| 威海市| 肥乡县| 崇信县| 枣强县| 浦江县| 宁化县| 永春县| 青铜峡市| 城市| 龙川县| 柏乡县| 易门县| 安庆市| 石景山区| 错那县| 鄱阳县| 太湖县| 株洲市| 大理市| 长武县| 固安县|