[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[日期时间] 批处理万年历(包括农历日期)


____________________________版主提醒____________________________

  为了避免影响技术讨论、提高看帖的舒适性,请大家不要在此帖下跟
无实质内容的口水帖,特别是纯顶、纯支持、纯感谢、路过之类的帖子,
管理人员将不定期清理此类回帖,请大家多参与讨论少灌水,与人方便,
终将给自己带来方便,谢谢合作。
________________________________________________________________
  1. :: 月历查询工具 最初发表于CN-DOS
  2. :: 原创:foxjl  更新:namejm, qzwqzw,foxjl
  3. :: 计算农历日期部分思路及算法来自"趣味东"
  4. :: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
  5. :: 在日历里面,★=当天
  6. :: 支持多种格式的日期输入:
  7. :: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
  8. :: ② 若输入两个数,则认为是查询年和月,★标在1日上;
  9. :: ③ 输全的话,★标在指定日期上
  10. :: 关于年份的转换:
  11. :: ① 若年份上输入的数字少于三位,则作如下转换:
  12. ::     50~99判定为19xx
  13. ::     0~49判定为20xx
  14. :: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
  15. ::    按 ① 的规则计算该年份的日期;
  16. :: 07-08-04 增加针对阳历的生肖及干支年计算;修改错误日期循环提示的BUG.
  17. :: 08-01-13 增加推算农历日期的功能,会有一天左右误差。
  18. @echo off
  19. color 1f
  20. mode con cols=40 lines=20
  21. setlocal enabledelayedexpansion
  22. set str=日一二三四五六七八九
  23. set sdate=%date%
  24. :Main
  25. cls&echo.
  26. :: 日期提取、格式化与校验
  27. for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
  28.     (set sy=%%i) && (set sm=%%j) && (set sd=%%k)
  29. )
  30. if not defined sd set sd=1
  31. if not defined sm set sm=%sy%&set sy=%date:~0,4%
  32. (set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
  33. (set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
  34. set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
  35. if errorlevel 9167 goto Error
  36. if %y% lss 100 (
  37.     if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
  38.     set sy=!y!
  39. )
  40. if %m% lss 13 if %d% lss 32 goto Calc
  41. :Error
  42. echo.错误的日期.
  43. pause>nul
  44. cd.
  45. set sdate=%date%
  46. goto Main
  47. :Calc
  48. ::计算农历部分
  49. set/a Q=(y-1901)/4
  50. set/a R=y-1901-4*Q
  51. set n=0
  52. for %%i in (0,31,59,90,120,151,181,212,243,273,304,334) do (
  53. set /a n+=1
  54. if %m% equ !n! set z=%%i)
  55. set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
  56. if %m% gtr 2 (if %leap% equ 0 (set /a z-=1) else (set /a z+=leap))
  57. 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
  58. if %h% equ 0 set h=29
  59. if %h% leq 10 (if %h% equ 10 (set h=初十) else (set h=初%h%)) else (set h=%h:~0,1%十%h:~-1%号)
  60. for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%)
  61. set h=%h:0=%
  62. :: 计算生肖及干支年
  63. set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
  64. set tg=庚辛壬癸甲乙丙丁戊己
  65. set dz=申酉戌亥子丑寅卯辰巳午未
  66. set /a sxnum=%sy% %% 12
  67. set /a tgnum=%sy:~-1%
  68. title 农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 农历:%h%
  69. :: 计算每个月的天数
  70. set days=31
  71. for %%i in (4 6 9 11) do if %m% equ %%i set days=30
  72. :: 计算2月份的偏差
  73. set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
  74. if %m% equ 2 set /a days=28+%leap%
  75. if %m% leq 2 (set /a y-=1& set /a m+=12)
  76. :: 计算指定日期的星期数
  77. set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
  78. echo.  %sy%年%sm%月   日期:%sy%-%sm%-%sd%,星期!str:~%w%,1!
  79. echo.
  80. :: 生成月历
  81. set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
  82. echo.    日   一   二   三   四   五   六
  83. echo. ━━━━━━━━━━━━━━━━━━━
  84. set /p= <nul
  85. for /l %%i in (0,1,37) do (
  86.     set "temp=  "
  87.     if %%i GTR %wb% if %%i LSS %we% (
  88.         set temp= !day!
  89.         set temp=!temp:~-2!
  90.         if !d! EQU !day! set temp=★
  91.         set /a day+=1
  92.     )
  93.     set /p=   !temp!<nul
  94.     set /a "wm=(%%i+1)%%7"
  95.     if !wm! equ 0 echo.&echo.&set /p= <nul
  96. )
  97. echo.
  98. echo  ━━━━━━━━━━━━━━━━━━━
  99. echo.  输入日期可查询当日星期并显示当月月历
  100. echo.
  101. set sdate=
  102. set /p sdate=  格式如:2007-02-03,[回车]退出:
  103. if defined sdate goto Main
复制代码
以下是各计算部分算法:
  1. 计算星期:
  2. 基姆拉尔森计算公式
  3.       W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
  4.       在公式中d表示日期中的日数+1,m表示月份数,y表示年数。
  5. 注意:在公式中有个与其他公式不同的地方:
  6.               把一月和二月看成是上一年的十三月和十四月,
  7. 例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
复制代码
  1. 生肖及干支年计算方法是:
  2. 出生公元年数÷12,然后根据除得的商的余数,对照生肖排列就马上可以知道。
  3. 生肖排列是:猴(0)、鸡(1)、狗(2)、猪(3)、鼠(4)、牛(5)、虎(6)、兔(7)、龙(8)、蛇(9)、马(10)、羊(11)。
  4. 天干地支算法:
  5. 首先要能记住十大天干和十二地支,
  6. 十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;
  7. 十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;
  8. 天干地支纪年法首先是天干在前,地支在后,比如今年2005就为-乙酉年,先来算算天干,有个公式:
  9. 4、 5、 6、 7、 8、 9、 0、 1、 2、 3 对应的十天干就是
  10. 甲、乙、丙、丁、戊、己、庚、辛、壬、癸,
  11. 数字为年代的最后的一位数字,比如今年是2005,最后一位是5,对应的天干就是乙;
  12. 地支的算法:用年代数除以12,后面的余数就代表某个地支,余数分别为:
  13.             4、 5、 6、 7、 8、 9、 10、 11、 0、 1、 2、 3,
  14. 代表地支为:子、丑、寅、卯、辰、巳、午、 未、 申、酉、戌、亥,
  15. 比如2005年为例:年代末尾数为5,对应的天干为乙,2005除以12,余数为1,对应的地支为酉,所以2005年为乙酉年。
复制代码
  1. 农历日期部分的算法是:
  2. 阴历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十 九日(大月为三十日)。然而目前记时通常用阳历日期表达,如欲将阳历日期换算成阴历日期可以用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是阴历几日?翻开万年历6月10日是阴历十一,则逆推6月8日是阴历初九。其二可以利用公式推算阴历日期:
  3. 设:公元年数-1977(或1901)=4Q+R
  4. 则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n
  5. (注:式中Q、R、n均为自然数,R<4)
  6. 例:1994年5月7日的阴历日期为:
  7. 1994-1977=17=4×4+1
  8. 故:Q=4,R=1 则:5月7日的阴历日期为:
  9. 14×4+10.6(1+1)+(31+28+31+30+7)-29.5n
  10. =204.2- 29.5n
  11. 然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日。
复制代码
7

评分人数

厉害,膜拜~

TOP

厉害,膜拜~

TOP

回复 1# foxJL 辛苦了!

TOP

本帖最后由 cyh1818 于 2019-1-8 17:25 编辑
我win7 64位
对不整齐,我一直解决不了。
folio 发表于 2015-9-30 11:46


win7 64位中第93行换下面这句:
  1. set /p=.   !temp!<nul
复制代码
效果如下:


顺带一提:82行日字前面去掉一个空格就完全对齐了

不好意思,发了帖才知道自己挖坟了
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

真下了功夫,不过农历还是差了一天,写这个很费脑细胞的,我写了个aw课件的,到2100也是差了一天,最后懒得研究强制判断加1了。

TOP

矮油、、非常感谢楼主的分享!支持...

TOP

回复 111# folio


代码里面93行 set /p=   !temp!<nul 这种用法在Win7里面不支持,字符串左侧的空格会被删掉,所以会变成这样。

TOP


我win7 64位
对不整齐,我一直解决不了。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

误差不止一天啊

TOP

格式对不齐

TOP

回复 1# foxJL


    难道我现在只能评论吗

TOP

Win7 x64 系统完全乱码,日期数字堆一块。。

TOP

本帖最后由 shelluserwlb 于 2014-12-31 14:05 编辑

强帖,顶一个。 唯一有遗憾就就是农历部分,楼主没有做出显示农历月份,不知道网上的万年历都是怎么做得,是否可以借鉴一下?  还有农历年与年之间不是以春节划分的,而是以节气中的“立春”来划分的。例: 2015年2月4(农历腊月十六)就是立春,生肖应该和农历年相邦定,从立春开始是乙未年,未在地支中与羊相对应,所以农历腊月十六日以后出生的人就应该属羊。

TOP


挤到一块了,怎么办?
Windows Server 2012 R2 Datacenter 64BIT
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

返回列表