无忧启动论坛

标题: 批处理,计算两个日期之间相差的天数 [打印本页]

作者: likeyouli    时间: 2024-3-12 11:47
标题: 批处理,计算两个日期之间相差的天数
本帖最后由 likeyouli 于 2024-3-12 16:11 编辑
  1. @echo off
  2. set /p "DateA=请输入日期,注意使用yyyymmdd格式:"
  3. set /p "DateB=请输入日期,注意使用yyyymmdd格式:"
  4. call :DateToDays %DateA:~0,4% %DateA:~4,2% %DateA:~6,2% DaysX
  5. call :DateToDays %DateB:~0,4% %DateB:~4,2% %DateB:~6,2% DaysY
  6. if %DaysX% geq %DaysY% (set /a DayZ=DaysX-DaysY) else (set /a DayZ=DaysY-DaysX)
  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
复制代码
东拼西凑了一段代码,后边的几行实在看不懂了,有懂的大神能否解释一下:
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
将第一行删后再观察运行结果
作者: yyz2191958    时间: 2024-3-12 12:13
我不晓得  帮顶
作者: nathan6498    时间: 2024-3-12 12:16
谢谢分享
作者: guong    时间: 2024-3-12 12:52
学习一下
作者: zr-71jp    时间: 2024-3-12 13:16
xls表格中不是有公式吗?还整那么麻烦的批处理?
作者: yuguotqing    时间: 2024-3-12 13:53
感谢分享
作者: likeyouli    时间: 2024-3-12 14:05
zr-71jp 发表于 2024-3-12 13:16
xls表格中不是有公式吗?还整那么麻烦的批处理?

excel、sql中都有函数可以直接确定两个日期之差,
  批处理我可以不会写,但我希望别人写的批处理我能看懂,能明白每句代码的意思
作者: tanchenglong    时间: 2024-3-12 14:35
直接利用VBS脚本计算
作者: nttwqz    时间: 2024-3-12 14:53
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
要了解语法的话,打set/?
要了解算法的话,百度儒略日
作者: likeyouli    时间: 2024-3-12 15:16
本帖最后由 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
szwp 发表于 2024-3-12 15:08
要了解语法的话,打set/?
要了解算法的话,百度儒略日

谢谢大师 。
作者: szwp    时间: 2024-3-12 15:26
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
1%dd%-100不是更清楚么
作者: likeyouli    时间: 2024-3-12 17:14
本帖最后由 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
1%dd%求余也一样
作者: likeyouli    时间: 2024-3-12 17:25
szwp 发表于 2024-3-12 17:17
1%dd%求余也一样

如果是人脑计算的话,我肯定愿意计算1%dd%-100, ,  100%dd%%%100给人的感觉先是一蒙,然后才能计算出求余的值。如果不认识%%是求余的,就更白搭了。
  不知道批处理解释器认为哪个更简单些
作者: szwp    时间: 2024-3-12 18:05
求差的话没必要都去-2472633
作者: likeyouli    时间: 2024-3-12 18:27
szwp 发表于 2024-3-12 18:05
求差的话没必要都去-2472633

最后两行set /a z=.. j=.. 我就看不懂了,不知道为什么要这样计算
作者: lixiangliuyi    时间: 2024-3-12 18:34
对批处理感兴趣的可以去批处理的论坛去系统的学习。
从最基础的学起来。

这样笼统的冷不丁的来问和回答,都会让人摸不着头脑。
作者: szwp    时间: 2024-3-12 18:36
likeyouli 发表于 2024-3-12 18:27
最后两行set /a z=.. j=.. 我就看不懂了,不知道为什么要这样计算

百度儒略日公式
作者: fzp070    时间: 2024-3-12 18:50
用DateDiff.exe这个命令行程序吧,代码会简洁些,见下
  1. DateDiff.exe 2024-03-12 2024-03-10  /D
复制代码
这里可下载
http://bcn.bathome.net/tool/DateDiff.exe
作者: yc2428    时间: 2024-3-12 20:53
xls表格
作者: fegr    时间: 2024-3-13 13:18
谢谢分享
作者: zlzx01    时间: 2024-3-15 08:27
有点意思
作者: 紧急追踪    时间: 2024-3-15 22:22
感谢分享
作者: ab12449    时间: 2024-3-26 03:21
感谢分享!!!
作者: 2012飘水    时间: 2024-4-2 21:44
学习学习,开拓思路,感谢各位大神
作者: lusir401    时间: 2024-4-30 15:44
用E xcel的函数很快的:
=ditedit(起始日期,终止日期,"D")
原来大家讨论的是用批处理解决。
作者: shanghui6666    时间: 2024-5-7 17:50
谢谢分享,支持原创,楼主不易,了表赞赏。




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3