[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
的确不错
但是发现一个bug,就是如果年份是2010年以后的农历日期会比正确的农历日期慢一天。

TOP

我美化了一下

  1. :: 月历查询工具
  2. :: 原创:foxjl  更新:namejm, qzwqzw,foxjl,aizzw
  3. :: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
  4. :: 在日历里面,☆=当天
  5. :: 支持多种格式的日期输入:
  6. :: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,☆标在1日上;
  7. :: ② 若输入两个数,则认为是查询年和月,☆标在1日上;
  8. :: ③ 输全的话,“ ☆”标在指定日期上
  9. :: 关于年份的转换:
  10. :: ① 若年份上输入的数字少于三位,则作如下转换:
  11. ::     50~99判定为19xx
  12. ::     0~49判定为20xx
  13. :: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
  14. ::    按 ① 的规则计算该年份的日期;
  15. :: 07-08-04 增加针对农历的生肖及干支年计算;修改错误日期循环提示的BUG.
  16. :: 08-01-13 增加推算农历日期的功能.
  17. @echo off
  18. color 2F
  19. mode con cols=40 lines=21
  20. setlocal enabledelayedexpansion
  21. set str=日一二三四五六七八九
  22. set sdate=%date%
  23. :Main
  24. cls&echo.
  25. :: 日期提取、格式化与校验
  26. for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
  27.     (set sy=%%i) && (set sm=%%j) && (set sd=%%k)
  28. )
  29. if not defined sd set sd=1
  30. if not defined sm set sm=%sy%&set sy=%date:~0,4%
  31. (set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
  32. (set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
  33. set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
  34. if errorlevel 9167 goto Error
  35. if %y% lss 100 (
  36.     if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
  37.     set sy=!y!
  38. )
  39. if %m% lss 13 if %d% lss 32 goto Calc
  40. :Error
  41. echo. 你输入的日期有错误,按任意键返回.
  42. pause>nul
  43. cd.
  44. set sdate=%date%
  45. goto Main
  46. :Calc
  47. ::计算农历部分
  48. set/a Q=(y-1901)/4
  49. set/a R=y-1901-4*Q
  50. set n=0
  51. for %%i in (0,31,59,90,120,151,181,212,243,273,304,334) do (
  52. set /a n+=1
  53. if %m% equ !n! set z=%%i)
  54. set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
  55. if %m% gtr 2 (if %leap% equ 0 (set /a z-=1) else (set /a z+=leap))
  56. 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
  57. if %h% equ 0 set h=29
  58. if %h% leq 10 (if %h% equ 10 (set h=初十) else (set h=初%h%)) else (set h=%h:~0,1%十%h:~-1%号)
  59. for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%)
  60. set h=%h:0=%
  61. :: 计算生肖及干支年
  62. set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
  63. set tg=庚辛壬癸甲乙丙丁戊己
  64. set dz=申酉戌亥子丑寅卯辰巳午未
  65. set /a sxnum=%sy% %% 12
  66. set /a tgnum=%sy:~-1%
  67. title 万年历
  68. :: 计算每个月的天数
  69. set days=31
  70. for %%i in (4 6 9 11) do if %m% equ %%i set days=30
  71. :: 计算2月份的偏差
  72. set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
  73. if %m% equ 2 set /a days=28+%leap%
  74. if %m% leq 2 (set /a y-=1& set /a m+=12)
  75. :: 计算指定日期的星期数
  76. set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
  77. echo.    %sy%年%sm%月  公历:%sm%-%sd%     星期!str:~%w%,1!
  78. :: 生成月历
  79. set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
  80. echo. ━━━━━━━━━━━━━━━━━━━
  81. echo.    日   一   二   三   四   五   六
  82. echo. ━━━━━━━━━━━━━━━━━━━
  83. set /p= <nul
  84. for /l %%i in (0,1,37) do (
  85.     set "temp=  "
  86.     if %%i GTR %wb% if %%i LSS %we% (
  87.         set temp= !day!
  88.         set temp=!temp:~-2!
  89.         if !d! EQU !day! set temp=☆
  90.         set /a day+=1
  91.     )
  92.     set /p=   !temp!<nul
  93.     set /a "wm=(%%i+1)%%7"
  94.     if !wm! equ 0 echo.&echo.&set /p= <nul
  95. )
  96. echo.
  97. echo  ━━━━━━━━━━━━━━━━━━━
  98. echo.   农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年  农历:%h%  生肖:!sx:~%sxnum%,1!
  99. echo  ━━━━━━━━━━━━━━━━━━━
  100. echo.  输入日期可查询当日星期并显示当月月历
  101. echo.
  102. set sdate=
  103. set /p sdate=  [回车]退出;格式如:2009-05-08:
  104. if defined sdate goto Main
复制代码

TOP

程序图
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

怎么发帖?

找了半天没找到可以发帖的地方

[ 本帖最后由 aizzw 于 2009-6-30 18:02 编辑 ]

TOP

返回列表