批处理,计算两个日期之间相差的天数
本帖最后由 likeyouli 于 2024-3-12 16:11 编辑@echo off
set /p "DateA=请输入日期,注意使用yyyymmdd格式:"
set /p "DateB=请输入日期,注意使用yyyymmdd格式:"
call :DateToDays %DateA:~0,4% %DateA:~4,2% %DateA:~6,2% DaysX
call :DateToDays %DateB:~0,4% %DateB:~4,2% %DateB:~6,2% DaysY
if %DaysX% geq %DaysY% (set /a DayZ=DaysX-DaysY) else (set /a DayZ=DaysY-DaysX)
echo %DateA%和%DateB%间隔的天数是:%DayZ%
goto :eof
:DateToDays %yy% %mm% %dd% days
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
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
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF东拼西凑了一段代码,后边的几行实在看不懂了,有懂的大神能否解释一下:
set /a dd=100%dd%%%100,mm=100%mm%%%100 这句是什么意思呢 ?尤其100%dd%%%100,%dd%是变量,代表前边第3个参数,即日期的最后两位,紧跟着又加了两个百分号是啥意思呢 ?
还有set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2 这句是啥意思呢?中间有什么逻辑呢 ?z/代表啥 ?
还有 set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633 这句,,最后这几句一直没弄懂啥计算逻辑 ,,
将第一行删后再观察运行结果 我不晓得帮顶 谢谢分享 学习一下 xls表格中不是有公式吗?还整那么麻烦的批处理? 感谢分享 zr-71jp 发表于 2024-3-12 13:16
xls表格中不是有公式吗?还整那么麻烦的批处理?
excel、sql中都有函数可以直接确定两个日期之差,
批处理我可以不会写,但我希望别人写的批处理我能看懂,能明白每句代码的意思 直接利用VBS脚本计算 likeyouli 发表于 2024-3-12 14:05
excel、sql中都有函数可以直接确定两个日期之差,
批处理我可以不会写,但我希望别人写的批处理我能 ...
从你的问题看,楼主接触set /a日期差等算法尚早,抖音在职程序要有说,算法是专门的人做的是,他们不一定会编程,大多数程序员都是利用现成的算法,而不是创造算法,所以能用就好,不一定非要看懂每个字符。
%在set /a里面表示求余运算,cmd默认无法计算小数,也可以用来判断能否整除,%%是用于转义。
set /a a+=1
等同于
set /a a=a+1
其它运算符号亦然。 要了解语法的话,打set/?
要了解算法的话,百度儒略日 本帖最后由 likeyouli 于 2024-3-12 16:06 编辑
nttwqz 发表于 2024-3-12 14:53
从你的问题看,楼主接触set /a日期差等算法尚早,抖音在职程序要有说,算法是专门的人做的是,他们不一定 ...
感谢,,
也就是说,dd=100%dd%%%100代表100连接变量dd后,再对100取余,比如我输入的日期是20240312的话,%dd%就是12,set /a dd=10012%%100,得到的余数是12,再赋值给dd,,貌似dd根本没有变化啊,难道此步计算多此一举 ?
.实测,把这行set /a dd=100%dd%%%100,mm=100%mm%%%100去掉, 运行结果没啥影响
. ...
我突然又想明白了,这句不能去掉,因为假如输入的日期是20240309,%dd%就是09,但经过set /a dd=100%dd%%%100运算后,%dd%就会变成9,而不是09了
szwp 发表于 2024-3-12 15:08
要了解语法的话,打set/?
要了解算法的话,百度儒略日
谢谢大师 。 likeyouli 发表于 2024-3-12 15:16
感谢,,
也就是说,dd=100%dd%%%100代表100连接变量dd后,再对100取余,比如我输入的日期是2024031 ...
进cmd打set /a 09+1和set /a 9+1就能看到差异了,仔细看set/?能明白。 1%dd%-100不是更清楚么 本帖最后由 likeyouli 于 2024-3-12 17:15 编辑
szwp 发表于 2024-3-12 16:56
1%dd%-100不是更清楚么
说的是,反正%dd%一定是2位数,不管是109-100=9,还是119-100=19,都可以完美的去除9前边的0而不影响%dd%的值。
用100连接%dd%再对100取余倒显得复杂了 1%dd%求余也一样 szwp 发表于 2024-3-12 17:17
1%dd%求余也一样
如果是人脑计算的话,我肯定愿意计算1%dd%-100, ,100%dd%%%100给人的感觉先是一蒙,然后才能计算出求余的值。如果不认识%%是求余的,就更白搭了。
不知道批处理解释器认为哪个更简单些{:1_186:} 求差的话没必要都去-2472633 szwp 发表于 2024-3-12 18:05
求差的话没必要都去-2472633
最后两行set /a z=.. j=.. 我就看不懂了,不知道为什么要这样计算 对批处理感兴趣的可以去批处理的论坛去系统的学习。
从最基础的学起来。
这样笼统的冷不丁的来问和回答,都会让人摸不着头脑。 likeyouli 发表于 2024-3-12 18:27
最后两行set /a z=.. j=.. 我就看不懂了,不知道为什么要这样计算
百度儒略日公式 用DateDiff.exe这个命令行程序吧,代码会简洁些,见下
DateDiff.exe 2024-03-12 2024-03-10/D这里可下载
http://bcn.bathome.net/tool/DateDiff.exe xls表格 谢谢分享 有点意思 谢谢 感谢分享 感谢分享!!! 学习学习,开拓思路,感谢各位大神
页:
[1]
2