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

原型:
  1. set/a days=d-719446+30*m+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400
  2. rem 日期转天数
  3. set/a d+=719050,d-=d/1461-d/36524+d/146097,y=d/365+1,r=!(y%%4)-!(y%%100)+!(y%%400),d+=(d%%=365)/(212+r)*30+r,d+=!!(d/(59+r))*(2-r),m=d/61*2+d%%61/31,d-=m*61/2+m*61%%2-1,m+=1-m/8
  4. rem 天数转日期
  5. set /a m+=!(m/=3)*12,week=(d+2*m+3*(m+1)/5+(y-=m/13)+y/4-y/100+y/400+1)%%7
  6. rem 日期转星期
复制代码

TOP

本帖最后由 CrLf 于 2012-4-4 00:41 编辑

Q1:
  1. @echo off
  2. set/a y1=2012,m1=4,d1=3,h1=1,f1=2,s1=9
  3. set/a y2=y1,m2=m1,d2=d1,h2=1,f2=3,s2=9
  4. set/a out=(d2-d1+30*(m2-m1)+m2/9*-~m2/2+!(m2/9)*m2/2+!!(m2/3)*(!(y2%%4)-!(y2%%100)+!(y2%%400)-2)-m1/9*+~m1/2-!(m1/9)*m1/2-!!(m1/3)*(!(y1%%4)-!(y1%%100)+!(y1%%400)-2)+(y2-y1)*365+~-y2/4-~-y2/100+~-y2/400-~-y1/4+~-y1/100-~-y1/400)*86400+(h2-h1)*3600+(f2-f1)*60+s2-s1
  5. echo %out%
  6. rem 输出值out=60
  7. pause
复制代码
思路:
  1. 年份之差*365+天数之差
  2. 按大小月、平闰年修正天数
  3. 所得天数乘一日总秒数
  4. 最后加上秒数差即可
复制代码
其余几个命题同样可依照几个原型公式稍加修改


与 Q1 同类的:
Q2:
  1. @echo off
  2. set/a y1=2012,m1=4,d1=3,h1=1,f1=2,s1=9
  3. set/a y2=y1,m2=5,d2=3,h2=1,f2=2,s2=9
  4. set/a out=d2-d1+30*(m2-m1)+m2/9*-~m2/2+!(m2/9)*m2/2+!!(m2/3)*(!(y2%%4)-!(y2%%100)+!(y2%%400)-2)-m1/9*+~m1/2-!(m1/9)*m1/2-!!(m1/3)*(!(y1%%4)-!(y1%%100)+!(y1%%400)-2)+(y2-y1)*365+~-y2/4-~-y2/100+~-y2/400-~-y1/4+~-y1/100-~-y1/400+((h2-h1)*3600+(f2-f1)*60+s2-s1)/86400
  5. echo %out%
  6. rem 输出值out=31
  7. pause
复制代码
Q3:
  1. @echo off
  2. set/a y1=2012,m1=4,d1=3,h1=1,f1=2,s1=9
  3. set/a y2=2012,m2=4,d2=5,h2=1,f2=2,s2=10
  4. set/a days=d2-d1+30*(m2-m1)+m2/9*-~m2/2+!(m2/9)*m2/2+!!(m2/3)*(!(y2%%4)-!(y2%%100)+!(y2%%400)-2)-m1/9*+~m1/2-!(m1/9)*m1/2-!!(m1/3)*(!(y1%%4)-!(y1%%100)+!(y1%%400)-2)+(y2-y1)*365+~-y2/4-~-y2/100+~-y2/400-~-y1/4+~-y1/100-~-y1/400,secs=(h2-h1)*3600+(f2-f1)*60+s2-s1
  5. set out=%days% %secs%
  6. echo %out%
  7. rem 输出值out=2 1
  8. pause
复制代码
顺便说一下,楼主似乎没有明确说明天数和秒数的概念,天数的计算是否要精确到秒?秒数的取值范围有多大(需要将相隔天数转为对应秒数吗)?

TOP

Q4:
  1. @echo off
  2. set/a y=2012,m=4,d=3,h=1,f=2,s=9
  3. set/a x=-4
  4. set/a d=d-397+30*m+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400+x,d-=d/1461-d/36524+d/146097,y=d/365+1,r=!(y%%4)-!(y%%100)+!(y%%400),d+=(d%%=365)/(212+r)*30+r,d+=!!(d/(59+r))*(2-r),m=d/61*2+d%%61/31,d-=m*61/2+m*61%%2-1,m+=1-m/8
  5. set out=%y% %m% %d% %h% %f% %s%
  6. echo %out%
  7. rem 输出值out=2012 4 3 1 1 8
  8. pause
复制代码
思路:
  1. 取天数加上偏移量
  2. 计算闰年数量取得年数
  3. 取得月份数量
  4. 取得天数(好像都是废话...)
复制代码
大同小异的 Q5:
  1. set/a s=h*3600+f*60+s+x,d=d-397+30*m+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400+s/86400,d-=d/1461-d/36524+d/146097,y=d/365+1,r=!(y%%4)-!(y%%100)+!(y%%400),d+=(d%%=365)/(212+r)*30+r,d+=!!(d/(59+r))*(2-r),m=d/61*2+d%%61/31,d-=m*61/2+m*61%%2-1,m+=1-m/8,h=s/3600%%60,f=s/60%%60,s%%=60
复制代码

TOP

Q6 照搬函数里的现成公式...
  1. @echo off
  2. set/a y=2012,m=4,d=3
  3. set /a m+=!(m/=3)*12,out=(d+2*m+3*(m+1)/5+(y-=m/13)+y/4-y/100+y/400+1)%%7
  4. echo %out%
  5. rem 输出值out=2
  6. pause
复制代码

TOP

本帖最后由 CrLf 于 2012-4-4 12:01 编辑

根据儒略日公式化简所得的 Q1 方案:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a y1=2012,m1=4,d1=3,h1=1,f1=2,s1=9
  3. set/a y2=y1,m2=m1,d2=d1,h2=1,f2=3,s2=9
  4. set /a "out=(1461*(y2+(m2-14)/12)/4+367*(m2-2-(m2-14)/12*12)/12-3*((y2+(m2-14)/12)/100+1)/4-1461*(y1+(m1-14)/12)/4-367*(m1-2-(m1-14)/12*12)/12+3*((y1+(m1-14)/12)/100+1)/4-d1+d2)*86400+(h2-h1)*3600+(f2-f1)*60+s2-s1"
  5. echo %out%
  6. rem 输出值out=60
  7. pause
复制代码
确实比早先那个从元年开始硬算的方案简洁

TOP

回复 15# neorobin


    叹为观止,m*306 真是绝妙的一招

TOP

本帖最后由 CrLf 于 2012-4-13 15:07 编辑

太棒了,佩服得五体投地
相比之下,我那笨办法是在是丢人死了...

TOP

返回列表