无忧启动论坛

标题: 【批处理】一行代码的昨天日期计算 [打印本页]

作者: nttwqz    时间: 2023-9-6 22:26
标题: 【批处理】一行代码的昨天日期计算
主要算法就一行,代码来自网络,年代久远,作者未知,非本人编写!

  1. @echo off
  2. set/a D=1%date:~8,2%%%100-1,M=1%date:~5,2%%%100-!D,Y=%date:~0,4%-!M,M+=!M*12,"K=!(M-4)|!(M-6)|!(M-9)|!(M-11)","D+=!D*(!(M-2)*(28+!(Y%%4))+K*30+(!!(M-2)&!K)*31)"
  3. set M=0%M%&set D=0%D%
  4. echo;%Y%-%M:~-2%-%D:~-2%&pause
复制代码


昨天日期计算.7z (305 Bytes, 下载次数: 52)

作者: chiannet    时间: 2023-9-7 00:19
本帖最后由 chiannet 于 2023-9-7 00:31 编辑
  1. @Echo Off


  2. For /f "Tokens=1-3 Delims=/ " %%I In ('Echo %Date:-=/%') Do Set TT=%%I-%%J-%%K

  3. Call :DateDiff %TT% -2 T
  4. echo 前天%T%

  5. Call :DateDiff %TT% -100 T
  6. echo 100天前是%T%

  7. Call :DateDiff %TT% 9999 T
  8. echo 9999天后的日期%T%
复制代码
借花献佛
作者: dayeye    时间: 2023-9-7 00:50
借花献佛
作者: batche    时间: 2023-9-7 00:53
本帖最后由 batche 于 2023-9-7 00:55 编辑

感谢分享,好算法,把润平年、大小月、跨年跨月都考虑进去了。
我尝试理解一下:
%date%是形如"yyyy(分隔符)MM(分隔符)DD"的日期格式,因为截取方式和计算方法的原因其他格式不行。
D=1%date:~8,2%%%100-1,截取日期,模100取余是为了处理0开头的日期,比如把08变成8,
然后把日期减一,遗憾的是它只能减一,因为D不能为负,也可以改但就不能跨了;
M=1%date:~5,2%%%100-!D,前面一样,最后-!D是处理跨月,当D为0时!D为1,即月份减一;
Y=%date:~0,4%-!M,同理,这是处理跨年的年份的;
M+=!M*12,这是处理跨年的月份的,当M为0时!M为1,月份为12;
年月份确定了,后面是计算日期的,
K=!(M-4)|!(M-6)|!(M-9)|!(M-11),当月份为1、2、3、5、7、8、10、12时,k为0;
D+=!D*(!(M-2)*(28+!(Y%%4))+K*30+(!!(M-2)&!K)*31),这里比较复杂,
当原来的D不为0时,即不跨年跨月时,D不变;
(!(M-2)*(28+!(Y%%4)),!(Y%%4)是判断闰年,闰年为1否则为0,!(M-2)是判断是否2月,闰年2月29天,平年28天,不是2月表达式为0不影响D;
K*30,月份4、6、9、11,k为1,30天,否则表达式为0不影响D;
(!!(M-2)&!K)*31),当月份为1、3、5、7、8、10、12时,31天。
作者: megatron    时间: 2023-9-7 04:19
对于编程是一窍不通
作者: 5962903    时间: 2023-9-7 06:19
算法就一行
作者: martin313    时间: 2023-9-7 06:36
路过学习
奉行拿来主义
作者: yyz2191958    时间: 2023-9-7 07:38
进来学习
作者: dx163    时间: 2023-9-7 09:17
向好学的坛友致敬
作者: 创新科技2015    时间: 2023-9-7 09:53
谢谢分享!
作者: dfdfdfdf99    时间: 2023-9-7 10:31
学习学习,谢谢分享。
作者: nttwqz    时间: 2023-9-7 11:12
batche 发表于 2023-9-7 00:53
感谢分享,好算法,把润平年、大小月、跨年跨月都考虑进去了。
我尝试理解一下:
%date%是形如"yyyy(分隔 ...

作者灵活运用了一元运算,省去了一堆条件判断。

话说,睡的挺晚啊……
作者: nttwqz    时间: 2023-9-7 11:25
megatron 发表于 2023-9-7 04:19
对于编程是一窍不通

这个其实和编程没什么关系,主要还是要数学好,就是灵活运用了一元运算符的数学公式。

!0=1
!1=0

0|0=0
0|1=1
1|1=1

0&0=0
0&1=0
1&1=1

作者: yc2428    时间: 2023-9-7 11:31
谢谢分享!
作者: wmjm    时间: 2023-9-7 11:37
学习一下,谢谢
作者: 12315sa    时间: 2023-9-7 13:06
谢谢分享
作者: Climbing    时间: 2023-9-7 15:31
chiannet 发表于 2023-9-7 00:19
借花献佛

你这个核心应该是datediff啊,没有啊。
作者: ppll2030    时间: 2023-9-8 00:28
batche 发表于 2023-9-7 00:53
感谢分享,好算法,把润平年、大小月、跨年跨月都考虑进去了。
我尝试理解一下:
%date%是形如"yyyy(分隔 ...

感谢解析。
作者: batche    时间: 2023-9-8 00:56
nttwqz 发表于 2023-9-7 11:12
作者灵活运用了一元运算,省去了一堆条件判断。

话说,睡的挺晚啊……

是很巧妙,我本以为会很复杂,但作者利用日期从1开始的特殊性,适用于计算昨天日期,利用取非就分开了跨年跨月,然后就只要判断月份就知道日期了。不过日期加减很多天还是很复杂,我尝试了一下还是弄不出来。
作者: yjstone    时间: 2023-9-8 13:34
思路真的是极为巧妙,跪拜了!也多谢batche的解读,要不真的要研究很久才弄得懂。
作者: CYYspace    时间: 2023-9-8 21:24
感谢分享
作者: dfdfdfdf99    时间: 2023-9-9 14:02
感谢分享
作者: bg888    时间: 2023-9-9 14:34
为什么不用 echo %date% 呢,出来今天的日期,不就知道昨天的日期了
作者: yjstone    时间: 2023-9-9 17:53
bg888 发表于 2023-9-9 14:34
为什么不用 echo %date% 呢,出来今天的日期,不就知道昨天的日期了

知道昨天日期是一回事,用电脑自动处理又是另一回事了。
作者: pda8888    时间: 2023-9-11 14:03
在windows 11 22h2 2134 命令行下,报错:
  1. 运算符不存在。
  2. -01-00
  3. 请按任意键继续. . .
复制代码

作者: nttwqz    时间: 2023-9-11 18:57
pda8888 发表于 2023-9-11 14:03
在windows 11 22h2 2134 命令行下,报错:

仅适用于默认日期格式
作者: yyz2191958    时间: 2023-9-16 19:21
有什么用?
作者: 窄口牛    时间: 2023-9-19 15:00
pda8888 发表于 2023-9-11 14:03
在windows 11 22h2 2134 命令行下,报错:

不要开启变量延迟
作者: 2012myjoys    时间: 2023-9-20 17:20
然而有啥用处呢
作者: DarlingC    时间: 2023-9-22 14:49
看着好难
作者: Batcher    时间: 2023-10-2 10:24
我能找到的较早的出处和讲解:
2011-01-24  bbs.bathome.net/thread-10879-1-1.html#pid69290
2011-01-09  bbs.bathome.net/thread-10704-1-1.html#pid68324
作者: nttwqz    时间: 2023-10-2 10:33
本帖最后由 nttwqz 于 2023-10-2 10:59 编辑
Batcher  2023-10-2 10:24

2011-01-24  bbs.bathome.net/thread-10879-1-1.html#pid69290
2011-01-09 ...


你是batche的马甲吗?
作者: Batcher    时间: 2023-10-2 11:10
nttwqz 发表于 2023-10-2 10:33
你是batche的马甲吗?

不是同一个人。我是2009年注册的。
作者: c3862004    时间: 2023-10-4 07:00
谢谢分享!
作者: zdlzj    时间: 2023-10-4 07:12

进来学习
作者: awan8850    时间: 2023-10-4 17:42
学习学习




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