likeyouli 发表于 2024-3-12 11:47:10

批处理,计算两个日期之间相差的天数

本帖最后由 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 这句,,最后这几句一直没弄懂啥计算逻辑 ,,



szwp 发表于 2024-3-12 12:07:57

将第一行删后再观察运行结果

yyz2191958 发表于 2024-3-12 12:13:45

我不晓得帮顶

nathan6498 发表于 2024-3-12 12:16:16

谢谢分享

guong 发表于 2024-3-12 12:52:47

学习一下

zr-71jp 发表于 2024-3-12 13:16:29

xls表格中不是有公式吗?还整那么麻烦的批处理?

yuguotqing 发表于 2024-3-12 13:53:18

感谢分享

likeyouli 发表于 2024-3-12 14:05:50

zr-71jp 发表于 2024-3-12 13:16
xls表格中不是有公式吗?还整那么麻烦的批处理?

excel、sql中都有函数可以直接确定两个日期之差,
批处理我可以不会写,但我希望别人写的批处理我能看懂,能明白每句代码的意思

tanchenglong 发表于 2024-3-12 14:35:52

直接利用VBS脚本计算

nttwqz 发表于 2024-3-12 14:53:26

likeyouli 发表于 2024-3-12 14:05
excel、sql中都有函数可以直接确定两个日期之差,
批处理我可以不会写,但我希望别人写的批处理我能 ...

从你的问题看,楼主接触set /a日期差等算法尚早,抖音在职程序要有说,算法是专门的人做的是,他们不一定会编程,大多数程序员都是利用现成的算法,而不是创造算法,所以能用就好,不一定非要看懂每个字符。

%在set /a里面表示求余运算,cmd默认无法计算小数,也可以用来判断能否整除,%%是用于转义。

set /a a+=1
等同于
set /a a=a+1
其它运算符号亦然。

szwp 发表于 2024-3-12 15:08:10

要了解语法的话,打set/?
要了解算法的话,百度儒略日

likeyouli 发表于 2024-3-12 15:16:19

本帖最后由 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了

likeyouli 发表于 2024-3-12 15:23:00

szwp 发表于 2024-3-12 15:08
要了解语法的话,打set/?
要了解算法的话,百度儒略日

谢谢大师 。

szwp 发表于 2024-3-12 15:26:56

likeyouli 发表于 2024-3-12 15:16
感谢,,
也就是说,dd=100%dd%%%100代表100连接变量dd后,再对100取余,比如我输入的日期是2024031 ...

进cmd打set /a 09+1和set /a 9+1就能看到差异了,仔细看set/?能明白。

szwp 发表于 2024-3-12 16:56:28

1%dd%-100不是更清楚么

likeyouli 发表于 2024-3-12 17:14:12

本帖最后由 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取余倒显得复杂了

szwp 发表于 2024-3-12 17:17:27

1%dd%求余也一样

likeyouli 发表于 2024-3-12 17:25:50

szwp 发表于 2024-3-12 17:17
1%dd%求余也一样

如果是人脑计算的话,我肯定愿意计算1%dd%-100, ,100%dd%%%100给人的感觉先是一蒙,然后才能计算出求余的值。如果不认识%%是求余的,就更白搭了。
不知道批处理解释器认为哪个更简单些{:1_186:}

szwp 发表于 2024-3-12 18:05:47

求差的话没必要都去-2472633

likeyouli 发表于 2024-3-12 18:27:46

szwp 发表于 2024-3-12 18:05
求差的话没必要都去-2472633

最后两行set /a z=.. j=.. 我就看不懂了,不知道为什么要这样计算

lixiangliuyi 发表于 2024-3-12 18:34:47

对批处理感兴趣的可以去批处理的论坛去系统的学习。
从最基础的学起来。

这样笼统的冷不丁的来问和回答,都会让人摸不着头脑。

szwp 发表于 2024-3-12 18:36:41

likeyouli 发表于 2024-3-12 18:27
最后两行set /a z=.. j=.. 我就看不懂了,不知道为什么要这样计算

百度儒略日公式

fzp070 发表于 2024-3-12 18:50:38

用DateDiff.exe这个命令行程序吧,代码会简洁些,见下
DateDiff.exe 2024-03-12 2024-03-10/D这里可下载
http://bcn.bathome.net/tool/DateDiff.exe

yc2428 发表于 2024-3-12 20:53:12

xls表格

fegr 发表于 2024-3-13 13:18:15

谢谢分享

zlzx01 发表于 2024-3-15 08:27:16

有点意思

softwarezheng 发表于 2024-3-15 09:19:04

谢谢

紧急追踪 发表于 2024-3-15 22:22:52

感谢分享

ab12449 发表于 2024-3-26 03:21:49

感谢分享!!!

2012飘水 发表于 2024-4-2 21:44:10

学习学习,开拓思路,感谢各位大神
页: [1] 2
查看完整版本: 批处理,计算两个日期之间相差的天数