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

调用函数~
  1. @echo off
  2. call :date2days 1990 1 1 2012 04 03 var
  3. set /a var%%=5
  4. if %var% leq 3 (echo 打鱼) else echo 晒网
  5. pause&exit
  6. :::::::::::::::::::::::::::::日期转天数函数::::::::::::::::::::::::::::
  7. :date2days
  8. :: 用法1:计算从 1970-01-01 到指定日期之间所经过的天数对应的日历日期。
  9. ::  call :Date2Days %yy% %mm% %dd% days
  10. ::  参数:%1 待转换的年
  11. ::        %2 待转换的月,可以以零开头
  12. ::        %3 待转换的日,可以以零开头
  13. ::        %4 该变量用于接收所经过的天数(可为空)
  14. ::
  15. :: 用法2:计算两个日期的天数差值
  16. ::  call :Date2Days %y1% %m1% %d1% %y2% %m2% %d2% days
  17. ::  参数:%1 待转换的年1
  18. ::        %2 待转换的月1,可以以零开头
  19. ::        %3 待转换的日1,可以以零开头
  20. ::        %4 待转换的年2
  21. ::        %5 待转换的月2,可以以零开头
  22. ::        %6 待转换的日2,可以以零开头
  23. ::        %7 该变量用于接收所经过的天数(可为空)
  24. ::
  25. :: 注:可选项若为空,则显示结果到屏幕,否则把结果存储到相应变量中
  26. ::
  27. ::                                Made by Crlf     http://bbs.bathome.net
  28. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  29. setlocal disabledelayedexpansion
  30. set/a days=10%~3%%100-719050+30*(m=10%~2%%100)+m/9*-~m/2+!(m/9)*m/2+!!(m/3)*(!((y=%1)%%4)-!(y%%100)+!(y%%400)-2)+y*365+~-y/4-~-y/100+~-y/400-396-%50/10*!%60
  31. (endlocal&set %7=%days%||set %4=%days%||echo %days%
  32. if %6. neq . call %0 %4 %5 %6 %7 %days%) 2>nul
  33. if /i %0==:date2days exit/b0
复制代码
函数未独立发帖,仅包含于此贴压缩包:http://www.bathome.net/thread-15186-1-4.html
1

评分人数

TOP

本帖最后由 CrLf 于 2012-4-3 21:30 编辑

该函数在区分大小月时采用了独创的算法,所以比较简洁
就题解题就改成这样:
  1. @echo off
  2. set /a y=2012,m=4,d=3
  3. set /a var=d-726467+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-396,var%%=5
  4. if %var% leq 3 (echo 打鱼) else echo 晒网
  5. pause
复制代码
其中用了大量的 ~-N,其实它与 N-1 等效(同理,-~N 与 N+1 等效),但由于 ~ 与 -(负号) 的优先级高于乘除运算,故 ~-N 可节省一对括号
当然还可以再简洁点,不过估计更没人看得懂了...
  1. @echo off
  2. set /a y=2012,m=4,d=3
  3. set /a "1/((d-726467-396+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)%%5/4)" 2>nul&&echo echo 晒网||echo 打鱼
  4. pause
复制代码
回复 9# HAT
算法简单解释:
set /a var=d-726863+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,var%%=5
  1. d-726467
  2. rem 用日减去 1970-01-01~1990-01-01 之间的天数
  3. 30*m+m/9*-~m/2+!(m/9)*m/2
  4. rem 先将月份统一乘 30 天,若m大于9,则将日期减去月份加1的一半,否则减去月份的一半
  5. !!(m/3)*(!(y%%4)-!(y%%100)+!(y%%400)-2)
  6. rem 当月份大于2的时候,天数减2,还要判断年份是否为闰年,如果是则加1
  7. y*365+~-y/4-~-y/100+~-y/400-396
  8. rem 先将年份统一乘365天,再减去闰年的数量
  9. -396
  10. rem 消除年月均从0开始计算产生的多余天数
  11. var%%=5
  12. rem 将所得的日期偏移量求余
复制代码
1

评分人数

TOP

返回列表