无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 2657|回复: 36
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2024-3-12 11:47:10 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 这句,,最后这几句一直没弄懂啥计算逻辑 ,,



点评

辛苦了  发表于 2024-5-7 17:58

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

2#
 楼主| 发表于 2024-3-12 14:05:50 | 显示全部楼层
zr-71jp 发表于 2024-3-12 13:16
xls表格中不是有公式吗?还整那么麻烦的批处理?

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

点评

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

使用道具 举报

3#
 楼主| 发表于 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了

点评

进cmd打set /a 09+1和set /a 9+1就能看到差异了,仔细看set/?能明白。  详情 回复 发表于 2024-3-12 15:26
回复

使用道具 举报

4#
 楼主| 发表于 2024-3-12 15:23:00 | 显示全部楼层
szwp 发表于 2024-3-12 15:08
要了解语法的话,打set/?
要了解算法的话,百度儒略日

谢谢大师 。
回复

使用道具 举报

5#
 楼主| 发表于 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取余倒显得复杂了
回复

使用道具 举报

6#
 楼主| 发表于 2024-3-12 17:25:50 | 显示全部楼层
szwp 发表于 2024-3-12 17:17
1%dd%求余也一样

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

使用道具 举报

7#
 楼主| 发表于 2024-3-12 18:27:46 | 显示全部楼层
szwp 发表于 2024-3-12 18:05
求差的话没必要都去-2472633

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

点评

百度儒略日公式  详情 回复 发表于 2024-3-12 18:36
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-19 13:05

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表