[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
大哥,你太强了,制作的东西太有价值了,没遇到这么强的,今天我算是彻底开了眼界,本来想给分的,但我不知道哪里给分

TOP

任意公元纪年转干支纪年(包括公元前)

  1. :: code by cqwyrm 2009-4-19
  2. @echo off
  3. set tg=甲乙丙丁戊已庚辛壬癸
  4. set dz=子丑寅卯辰巳午未申酉戍亥
  5. :main
  6. cls
  7. set /p year= 请输入年份(公元前请输入负数):
  8. set input=%year%
  9. set /a ninput=%year%*(-1)
  10. if %year% LSS -57 set /a year=(%year%)%%60
  11. if %year% LSS 0 set /a year=%year%+61
  12. if %year%==0 (echo         SB,哪有公元零年啊!!!!) & goto next
  13. if %year% LSS 3  set /a year=%year%+60
  14. set /a temp1=((%year%-3)%%60)%%10
  15. set /a temp2=((%year%-3)%%60-%temp1%)/10
  16. set /a x=%temp1%-1
  17. set /a y=(%temp1%+12-%temp2%*2)%%12-1
  18. if %x%==-1 set /a x=%x%+10
  19. if %y%==-1 set /a y=%y%+12
  20. for /l %%i in (0,1,%x%) do (
  21.     call set char1=%%tg:~%%i,1%%
  22. )
  23. for /l %%i in (0,1,%y%) do (
  24.     call set char2=%%dz:~%%i,1%%
  25. )
  26. if %input% LSS 0 echo                 公元前%ninput%年 是 %char1%%char2%年
  27. if %input% GTR 0 echo                 公元%input%年 是 %char1%%char2%年
  28. :next
  29. echo.
  30. echo.
  31. echo                 请按任意键继续查询
  32. pause >nul
  33. goto main
复制代码

TOP

这个算法肯定有问题,考虑了闰年、闰月了吗?我随便拿我的生日算了一下,就差一天:
在公历(格里历)纪年中,有闰日的年份叫闰年,一般年份365天,闰年为366天。由于地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年,公历把一年定为365天。所余下的时间约为四年累计一天,加在二月里,所以平常年份每年365天,二月为28天,闰年为366天,二月为29天。因此,每400年中有97个闰年,闰年在2月末增加一天,闰年366天。 闰年的计算方法:公元纪年的年数可以被四整除,即为闰年;被100整除而不能被400整除为平年;被100整除也可被400整除的为闰年。如2000年是闰年,而1900年不是。
    下面是一个计算公历闰年的例子:
     s = InputBox("请输入年份:")
     n = Val(s)
     If n Mod 400 = 0 Or (n Mod 4 = 0 And n Mod 100 <> 0) Then
     MsgBox s + "是闰年!"
     End If
中国旧历农历纪年中,有闰月的一年称为闰年。一般年份为12个月,354或355天,闰年则为13个月,383或384天。农历作为阴阳历的一种,每月的天数依照月亏而定,一年的时间以12个月为基准;为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月,因此农历的闰年为13个月。
    农历没有第十三月的称谓,闰月按照历法规则,排放在从二月到十月的过后重复同一个月,重复的这个月为闰月,如四月过后的闰月称为闰四月。
    农历闰年闰月的推算,3年一闰,5年二闰,19年七闰;农历基本上19年为一周期对应于公历同一时间。如公历的2001年5月27日、1982年5月27日和1963年5月27日这个日子,都是闰四月初五。
闰月加到哪个月,以农历历法规则推断,主要依照与农历的二十四节气相符合来确定;
农历的闰月天数与正常月份天数一样,为29或30天。
农历所谓“闰”的说法,只有闰年和闰月称谓,公历也有闰年的称谓。
公历1982年至2042年与农历闰年闰月对照表
    公历所在月份 闰月(初一日) 干支年
    1982年5月23日 闰四月小 壬戊年
    1984年11月23日 闰十月大 甲子年
    1987年7月26日 闰六月大 丁卯年
    1990年6月23日 闰五月大 庚午年
    1993年4月22日 闰三月大 癸酉年
    1995年9月25日 闰八月大 乙亥年
    1998年6月24日 闰五月小 戊寅年
    2001年5月23日 闰四月大 辛巳年
    2004年3月21日 闰二月大 甲申年
    2006年8月24日 闰七月大 丙戊年
    2009年6月23日 闰五月大 己丑年
    2012年5月21日 闰四月小 壬辰年
    2014年10月24日 闰九月小 甲午年
    2017年7月23日 闰六月大 丁酉年
    2020年5月23日 闰四月小 庚子年
    2023年3月22日 闰二月大 癸卯年
    2025年7月25日 闰六月大 己巳年
    2028年6月23日 闰五月大 戊申年
    2031年4月22日 闰三月大 辛亥年
    2033年8月25日 闰七月大 癸丑年
    2036年7月23日 闰六月小 丙辰年
    2039年6月22日 闰五月大 己未年
    2042年3月22日 闰二月大 壬戊年

有一个现成的例子,javascript农历日历,试了一下很准确,起码我的生日没算错
https://www.xfocus.net/bbs/index ... p;t=1479&p=3970

TOP

回楼上的朋友,关于公历润年此脚本是可以计算的,并没有问题。
但通过公历来推算农历,至今都没有完美的方法,不能算出月份,日期有时也会出现一天左右的误差。你所说的javascript日历表不过是通过一堆16进制的数据来查询的,并不是推算。你可以输入100年的日期,那上面就没有农历显示了。
批处理也有人写过通过数据查询的日历,你可以参考一下:http://www.cn-dos.net/forum/view ... ght=%2B%E5%8E%86%2B

TOP

的确不错
但是发现一个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

真佩服你在做的批处理,学习。

TOP

确实很不错,记得以前上学的时候想用c#编写,结果已失败告终。

TOP

看了"月历查询工具"发现一个BUG,宽度应该改大一点,不然在输入日期时,会自动换行,并且很不美观.测试一下就知道效果不同了.

原文代码效果图:

宽度修改以后的代码效果图

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

TOP

怎么发帖?

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

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

TOP

回复 58楼 的帖子

Q: 为何无法在某些版块发帖?
A: http://bbs.bathome.net/thread-2128-1-1.html
(*^_^*)

TOP

请楼主在核实一下,农历是不是计算有问题。我试了试1981年12月29日,计算农历为初三。实际情况是初四。

TOP

貌似有bug,可能计算错误,查一下19910218 那天的阴历为初五,可是我用一些网站上的,和nokia手机去查的那天是初四.

TOP

羡慕啊,学习中
楼主确实牛

TOP

返回列表