无忧启动论坛

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

[分享] 【批处理】一行代码的昨天日期计算

  [复制链接]
1#
发表于 2023-9-7 00:53:51 | 显示全部楼层
本帖最后由 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天。

点评

感谢解析。  详情 回复 发表于 2023-9-8 00:28
作者灵活运用了一元运算,省去了一堆条件判断。 话说,睡的挺晚啊……  详情 回复 发表于 2023-9-7 11:12
回复

使用道具 举报

2#
发表于 2023-9-8 00:56:45 | 显示全部楼层
nttwqz 发表于 2023-9-7 11:12
作者灵活运用了一元运算,省去了一堆条件判断。

话说,睡的挺晚啊……

是很巧妙,我本以为会很复杂,但作者利用日期从1开始的特殊性,适用于计算昨天日期,利用取非就分开了跨年跨月,然后就只要判断月份就知道日期了。不过日期加减很多天还是很复杂,我尝试了一下还是弄不出来。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-13 13:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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