设为首页 | 收藏本页
登陆您的帐号 | 免费注册帐号
全部栏目 > 计算机 > 软件 > 人工智能
下一篇上一篇 首页图文展示(无图)

批处理万年历(包括农历日期)

发布人:hy58
发布日期:2015-06-06 09:49:22
刷新日期:2015-06-06 09:49:22
回复或评论:0
阅览:289
复制内容到剪贴板    
    代码:   
    :: 月历查询工具 最初发表于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即是阴历二十七日。
评论(0) 暂无回帖


打印 收藏 关闭窗口 下一篇上一篇