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