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

[日期时间] 一段计算日期间隔的批处理代码死活看不懂,,

本帖最后由 likeyou32 于 2024-3-12 16:54 编辑
  1. @echo off
  2. set "DateA=2024-03-12"
  3. set "DateB=2024-02-28"
  4. call :DateToDays %DateA:~0,4% %DateA:~5,2% %DateA:~8,2% DaysX
  5. call :DateToDays %DateB:~0,4% %DateB:~5,2% %DateB:~8,2% DaysY
  6. set /a DayZ=DaysX-DaysY
  7. echo %DateA%和%DateB%间隔的天数是:%DayZ%
  8. goto :eof
  9. :DateToDays %yy% %mm% %dd% days
  10. setlocal ENABLEEXTENSIONS
  11. set yy=%1&set mm=%2&set dd=%3
  12. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  13. set /a dd=100%dd%%%100,mm=100%mm%%%100
  14. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  15. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  16. endlocal&set %4=%j%&goto :EOF
复制代码
第12行:set yy=%1&set mm=%2&set dd=%3  把变量yy设为1%,1%为第4行或第5行的第一个参数取值,后边的mm dd以此类推,,
第13行的1%yy%  是什么东西? 1%还是代表前边第4行的%DateA:~0,4%,可yy%又是什么东西呢 ? 按说应该两个百分号%yy%才对啊,前边12行yy已经等于1%了,实在不清楚1%yy% 表示啥意思了 ?

上边是原贴,%1、%4这才代表call后的参数,1%根本就没这个表示法,或者就代表百分之一。

回复 1# likeyou32


%yy%是一个变量,1%yy%表示在变量左侧补了个1,例如:

当yy=99的时候,实际执行的是:
if 199 LSS 200 if 199 LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
得到的是:yy=1999

当yy=24的时候,实际执行的是:
if 124 LSS 200 if 124 LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
得到的是:yy=2024
测试代码之前请做好备份

TOP

  1. 1%
  2. %1
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 likeyou32 于 2024-3-12 10:26 编辑

回复 2# ShowCode


    谢谢, 其实后边这几行没看懂,到底逻辑思维是啥呀? 我把dateA dateB 带入几个日期测试了一下,差的天数倒是正确的,但一直没明白怎么计算出来的,还有以前都是禁止变量延迟,这里专门setlocal ENABLEEXTENSIONS,为什么要这样设置啊
  1. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  2. set /a dd=100%dd%%%100,mm=100%mm%%%100
  3. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  4. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
复制代码

TOP

if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%) 这行不会执行,无视就行
set /a dd=100%dd%%%100,mm=100%mm%%%100 这行是处理0开头的数字
再后面的就是计算方式

TOP

回复 4# likeyou32


日期计算的根本是基于平闰年、大小月的数学计算。
会用就行了,不一定都需要理解。可以看看这个类似代码的解读:
http://bbs.bathome.net/thread-16683-1-1.html#pid108003
测试代码之前请做好备份

TOP

回复 6# ShowCode


    感谢 ,,

TOP

回复 5# Five66


   
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)  这行我也认为不会运行,毕竟yy是call后第一个参数%DateA:~0,4%,截取的是4位,前边再加1,怎么可能会小于200呢!
后边的set /a dd=100%dd%%%100,mm=100%mm%%%100 这行,%%是取余,目的是将10号之前的日期如09什么的,变成9。 再往后的两行代码 set /a z=..j=..的,是说啥里也看不懂了,还有为什么用setlocal ENABLEEXTENSIONS 也不太明白,以前都是setlocal enabledelayedexpansion禁止环境变量延迟。

TOP

回复 8# likeyou32


那是出自函数库里面的一段代码
http://bbs.bathome.net/thread-3056-1-1.html

DateToDays 参数列表里面有说明:
%1 待转换的年,两位或者四位(传值调用)
%2 待转换的月,可以以零开头(传值调用)
%3 待转换的日,可以以零开头(传值调用)
%4 该变量用于接收所经过的天数(引用调用)
测试代码之前请做好备份

TOP

返回列表