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

个人较倾向于转换成儒略日 然后计算
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 31) do set "D%%i=0%%i"
  3. set "Xq=一二三四五六日"
  4. set "Ymda=1990 1 1"&set "Ymdb=2012 4 3"
  5. for /f "tokens=1-6" %%i in ("%Ymda% %Ymdb%") do set /a "JDA=%%k-32075+1461*(%%i+4800+(%%j-14)/12)/4+367*(%%j-2-(%%j-14)/12*12)/12-3*((%%i+4900+(%%j-14)/12)/100)/4,JDB=%%n-32075+1461*(%%l+4800+(%%m-14)/12)/4+367*(%%m-2-(%%m-14)/12*12)/12-3*((%%l+4900+(%%m-14)/12)/100)/4,JD=JDB-JDA"
  6.    echo %Ymda% 至 %Ymdb% 相隔  %JD% 天
  7.    REM 查询N天前或后的日期;
  8.    set/p N=请输入天数(往前查询加上-如:-10000 表示10000天前的日期。):
  9.    set /a JD=N+JDA,W=JD%%7,JD+=68569,N=(4*JD)/146097,JD-=(146097*N+3)/4,I=(4000*JD+1)/1461001,JD-=(1461*I)/4-31,J=(80*JD)/2447,D=JD-(2447*J)/80,JD=J/11,M=J+2-(12*JD),Y=100*(N-49)+I+JD
  10.    for /f "tokens=1-3" %%i in ("!M! !D! !W!") do echo;你查询的是:!Y!年!D%%i:~-2!月!D%%j:~-2!日 星期!Xq:~%%k,1!
  11. pause
复制代码
1

评分人数

    • CrLf: 这个好PB + 5 技术 + 1

TOP

本帖最后由 terse 于 2012-4-7 23:55 编辑

1858 年 11 月 17 日 应该是简化后的吧
儒略日应该推前-4712年1月1日 是儒略日的第0日
这里的 306 是否可看作是30.5833333的近似值  也就是 30.5833333 * M  
这里 (306*m+5)/10 可看作 30.6*M+0.5

这里的 0.5 应该是一个修正 就是+0.5天 因为儒略日简化前 是以中午12点起始计算的

现在计算儒略日公式  譬如(SET /A "M=(M+9)%%12+3,Y=Y-M/13,JDB=365*(4712+Y)+(4712+Y)/4+153*(M+1)/5-Y/100+Y/400+D-61")

只是计算 1582年10月15后的 之前的要+10天  也就是 1582年10月4日至1582年10月14日是空白的

TOP

发出后 看到P兄已发
  1. (153*M+2)/5
复制代码

TOP

没完全测试 翻版一下网上资料及万年历
  1. @echo off&setlocal enabledelayedexpansion
  2. FOR /l %%i in (0 1 7305155) DO (
  3.     set JD=%%i
  4.     IF !JD! GEQ 2299161 set /a "JD+=1+(JD*100-186721625)/3652425-(JD*100-186721625)/3652425/4"
  5.     set /a "B=JD+1524,Y=(B*100-12210)/36525,D=36525*Y/100"
  6.     set /a "M=(B-D)*10000/306001,D=B-D-306001*M/10000,M=(M-2)%%12+1,Y-=4715+^!(2/M)"
  7.     set "test=%%i:   !y!.!m!.!d!"
  8.     set /a "M=(M+9)%%12+3,Y-=M/13,JD=36525*(Y+4716)/100+306001*(M+1)/10000+D-1524"
  9.     set /a "JD+=(2-Y/100+Y/400)*^!(2299161/JD)"
  10.     set "test=!test!     !JD!"
  11.     if "!JD!" neq "%%i" set "test=!test!     error"
  12.     echo !test!
  13.     if "!test:error=!" neq "!test!" pause
  14. )
  15. PASUE
复制代码

TOP

回复 42# neorobin
以此代码推算至100.2.28后就是100.3.1按实历算的话应该是100.2.29后才是100.3.1
这里是否考虑实历1582前后问题 即1582前每4年一闰  1582后才多了100和400余
也就是说如果这里仅仅代表一种序号的话 那这个序号的合理性应该是计算1582年10月15号后的
譬如 1582年10月4号 儒略日 (2299160)  后一日 便直接跳至1582年10月15日 儒略日 (2299161)
也可能个人理解的不同  故一点浅见而已
1

评分人数

    • CrLf: 强大的一群技术 + 1

TOP

回复 46# plp626
100-2-28 的下一天是 100-2-29
这里说的公元100年2月应该有29天
前面我提到 公元1582年10月4号前是每4年一闰  不管年份是否可被100或400整除
1582年10月由格勒哥里十三世改革成为格勒哥里历,取消1582年10月5日至1582年10月14日这10日及取消400年内00年尾的3个闰年,使一年的平均日数变成365.2425日,更接近于准确的回归年365.2422日。
格勒哥里历(也就是现在大多使用的):
每4年置闰年一次,闰年366日,二月29日.凡年份数可被4 整除者,置闰. 如1960,1996等.凡年份数可被100整除者,不置闰, 如1800,1900.凡年份数可被400整除者,置闰, 如2000,2400.

TOP

针对1582 10 4 ----1582 10 15 的测试
  1. @echo off&setlocal enabledelayedexpansion
  2. (FOR /l %%i in (2298883 1 2299603) DO (
  3.     set JD=%%i
  4.     IF !JD! GEQ 2299161 set /a "JD+=1+(JD*100-186721625)/3652425-(JD*100-186721625)/3652425/4"
  5.     set /a "B=JD+1524,Y=(B*100-12210)/36525,D=36525*Y/100"
  6.     set /a "M=(B-D)*100/3061,D=B-D-3061*M/100,M=(M-2)%%12+1,Y-=4715+^!(2/M)"
  7.     set "str=!Y!:!M!:!D!"
  8.     set /a "M=(M+9)%%12+3,Y-=M/13,JD=36525*(Y+4716)/100+3061*(M+1)/100+D-1524"
  9.     REM 1582年10月4日后重新计算闰年,先前每4年一闰.
  10.     set /a "JD+=(2-Y/100+Y/400)*^!(2299161/JD)"
  11.     ECHO !str! !JD!
  12. ))>Yjd.txt
  13. start "" "Yjd.txt"
  14. PAUSE
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (31 28 31 30 31 30 31 31 30 31 30 31) do set /a N+=1&set "M_!N!=%%i"
  3. set JDX=2298883
  4. for /l %%i in (1582 1 1583) do (
  5.      IF %%i gtr 1582 (
  6.         set /a "N=^!(%%i%%4)^^^!(1582/%%i)&^!(%%i%%400)^^^!(1582/%%i)&^!(%%i%%100)"
  7.      ) else set /a "N=^!(%%i%%4)"
  8.      set /a M_2=28+N
  9.      for /l %%j in (1 1 12) do (
  10.          set /a "M=(%%j+9)%%12+3,Y=%%i-M/13"
  11.          for /l %%k in (1 1 !M_%%j!) do (
  12.              set /a "JD=36525*(Y+4716)/100+3061*(M+1)/100+%%k-1524,JDX+=1"
  13.              set /a "JD+=(2-Y/100+Y/400)*^!(2299161/JD)"  2>nul
  14.              IF !JDX! NEQ !JD! set ERR=!err!$err:%%i:%%j:%%k !JD! !JDX!$
  15.              REM 1582年10月4日后初始日须减10天
  16.              if "%%i:%%j:%%k" == "1582:10:5" set/a JDX-=10
  17.          )
  18.      )
  19. )
  20. IF DEFINED ERR echo !err:$=^
  21. !
  22. ECHO !JD! !JDX!
  23. pause
复制代码

TOP

本帖最后由 terse 于 2012-4-12 12:49 编辑

折腾于2月的序列  是一律按现历计算吗  

先前的代码先删吧

TOP

回复 70# plp626
在56楼 我对 现历转儒略历,和儒略历转现历 发的测试代码
如你所说 我想 365.25 和365.2425 差距是否就是儒略历 一直4年一闰  现历也就是(格历)比较 儒略历 应是 400年 少3 闰
我不知道现在讨论的 是儒略历和现历的互转 还是以现历 序号的互转
如是序号现历的互转 是否看少个 1582年10月的判断 只需每400年多一闰
把每年的3月 看做是一年的开始 然后2月放在做后 管他28天还是29天 反正算来是最后月了 最后按4年一个循环计算也就是 1461 天
感觉算法应该差不多 只要有一个统一下序号是按儒略历或者现历来排列即可吧
现历主要有4年一闰的麻烦(所以有了+Y/400) 而儒略历似乎看作更简便点

TOP

返回列表