计算机中批处理如何实现万年日历

这篇文章主要介绍了计算机中批处理如何实现万年日历,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

核心源码

计算机中批处理如何实现万年日历

::月历查询工具最初发表于CN-DOS
::原创:foxjl更新:namejm,qzwqzw,foxjl
::计算农历日期部分思路及算法来自"趣味东"
::输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
::在日历里面,★=当天
::支持多种格式的日期输入:
::①若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
::②若输入两个数,则认为是查询年和月,★标在1日上;
::③输全的话,★标在指定日期上
::关于年份的转换:
::①若年份上输入的数字少于三位,则作如下转换:
::50~99判定为19xx
::0~49判定为20xx
::②若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
::按①的规则计算该年份的日期;
::07-08-04增加针对阳历的生肖及干支年计算;修改错误日期循环提示的BUG.
::08-01-13增加推算农历日期的功能,会有一天左右误差。
@echooff
color1f
modeconcols=40lines=20
setlocalenabledelayedexpansion
setstr=日一二三四五六七八九
setsdate=%date%
:Main
cls&echo.
::日期提取、格式化与校验
for/f"tokens=1,2,3delims=-/:"%%iin("%sdate%")do(
(setsy=%%i)&&(setsm=%%j)&&(setsd=%%k)
)
ifnotdefinedsdsetsd=1
ifnotdefinedsmsetsm=%sy%&setsy=%date:~0,4%
(setsy=0000%sy%)&&(setsm=00%sm%)&&(setsd=00%sd%)
(setsy=%sy:~-4%)&&(setsm=%sm:~-2%)&&(setsd=%sd:~-2%)
set/ay=1%sy%-10000,m=1%sm%-100,d=1%sd%-1002>nul
iferrorlevel9167gotoError
if%y%lss100(
if%y%lss50(set/ay+=2000)else(set/ay+=1900)
setsy=!y!
)
if%m%lss13if%d%lss32gotoCalc
:Error
echo.错误的日期.
pause>nul
cd.
setsdate=%date%
gotoMain
:Calc
::计算农历部分
set/aQ=(y-1901)/4
set/aR=y-1901-4*Q
setn=0
for%%iin(0,31,59,90,120,151,181,212,243,273,304,334)do(
set/an+=1
if%m%equ!n!setz=%%i)
set/aleap="^!(y%%4)&^!(^!(y%%100))|^!(y%%400)"
if%m%gtr2(if%leap%equ0(set/az-=1)else(set/az+=leap))
set/an=(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%equ0seth=29
if%h%leq10(if%h%equ10(seth=初十)else(seth=初%h%))else(seth=%h:~0,1%十%h:~-1%号)
for/l%%iin(1,1,9)do(callseth=%%h:%%i=!str:~%%i,1!%%)
seth=%h:0=%
::计算生肖及干支年
setsx=猴鸡狗猪鼠牛虎兔龙蛇马羊
settg=庚辛壬癸甲乙丙丁戊己
setdz=申酉戌亥子丑寅卯辰巳午未
set/asxnum=%sy%%%12
set/atgnum=%sy:~-1%
title农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年生肖:!sx:~%sxnum%,1!农历:%h%
::计算每个月的天数
setdays=31
for%%iin(46911)doif%m%equ%%isetdays=30
::计算2月份的偏差
set/aleap="^!(y%%4)&^!(^!(y%%100))|^!(y%%400)"
if%m%equ2set/adays=28+%leap%
if%m%leq2(set/ay-=1&set/am+=12)
::计算指定日期的星期数
set/aw=(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/awb=(w+35-d)%%7,we=wb+days+1,day=1
echo.日一二三四五六
echo.━━━━━━━━━━━━━━━━━━━
set/p=<nul
for/l%%iin(0,1,37)do(
set"temp="
if%%iGTR%wb%if%%iLSS%we%(
settemp=!day!
settemp=!temp:~-2!
if!d!EQU!day!settemp=★
set/aday+=1
)
set/p=!temp!<nul
set/a"wm=(%%i+1)%%7"
if!wm!equ0echo.&echo.&set/p=<nul
)
echo.
echo━━━━━━━━━━━━━━━━━━━
echo.输入日期可查询当日星期并显示当月月历
echo.
setsdate=
set/psdate=格式如:2007-02-03,[回车]退出:
ifdefinedsdategotoMain

以下是各计算部分算法:

计算星期:基姆拉尔森计算公式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即是阴历二十七日。

感谢你能够认真阅读完这篇文章,希望小编分享的“计算机中批处理如何实现万年日历”这篇文章对大家有帮助,同时也希望大家多多支持恰卡编程网,关注恰卡编程网行业资讯频道,更多相关知识等着你来学习!

发布于 2021-03-21 22:37:28
收藏
分享
海报
0 条评论
174
上一篇:HTML5如何通过Vedio标签实现视频循环播放 下一篇:html5如何实现视频自动横过来自适应页面且点击播放功能
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码