标题: [日期时间] 批处理计算给定日期(年月日)是星期几,是当年第几周 [打印本页]
作者: cutebe 时间: 2021-1-22 23:46 标题: 批处理计算给定日期(年月日)是星期几,是当年第几周
星期公式:
(上年\4-上年\100+上年\400+上年+当年第几天)%7=
- @echo off
- setLocal enableDelayedExpansion
- :begin
- ::set idate=2021-01-23
- ::set idate=%date%
- set/pidate=请输入日期(YYYY-MM-DD):
- set idate=%idate:+=%
- set idate=%idate:-=%
- set idate=%idate:/=%
- set idate=%idate:.=%
- set idate=%idate: =%
- set/a y=1%idate:~,4%-10000
- set/a m=1%idate:~4,2%-100
- set/a d=1%idate:~6,2%-100
-
- set/a y1=y-1,m3=(m-1)*3
- ::开启变量延迟后,非运算符!要用^转义:^!
- set/a "leap=^!(y%%4)&^!^!(y%%100)|^!(y%%400)",t2=28+leap
- set E=+31+t2+31+30+31+30+31+31+30+31+30+31
- set/a t=0!E:~,%m3%!+d,ty=0%E%
- set/a w=(y1/4-y1/100+y1/400+y1+t)%%7
- set/a w0=(y1/4-y1/100+y1/400+y1)%%7,z=(w0+t+(7-w)%%7)/7
-
- set ytype=平闰
- echo/ %y%是!ytype:~%leap%,1!年,有%ty%天;
- set week=天一二三四五六
- echo/ %y%-%m%-%d%是周!week:~%w%,1!,是当年第%z%周。
- echo/
- goto :begin
-
- goto :eof
-
- 星期公式:
- (上年\4-上年\100+上年\400+上年+当年第几天)%7=
-
- 测试
- 2021-01-21
- (505-20+5+2020+21)%7=4 4
-
- 2013-04-08 31+28+31+8=98
- (503-20+5+2012+98)%7=1 1
-
- 2012-03-06 31+29+6=66
- (502-20+5+2011+66)%7=2 2
复制代码
星期计算原理:
一个星期有七天,周而复始,循环往复。
假定现有历法不变,往前推公元元年1月1号(即0001-01-01起始)是星期一。
基于以上假设,要计算星期数,只要计算从公元起始经过了多少天,对7取余数就是星期几了!!
思考:如果知道某年1月1号是星期几,要计算当年另一个日期的星期是不是可行呢?
因为星期是周而复始的,过去的每一年天数也是固定的,我们不用每天都统计,可以简化。
每年有365或366天,平年365正好是52周多1天,因此每年1月1号的星期数是之前一年+1,闰年后面讨论。
年数是就往年去掉整周后多出来的天数,每遇到一个闰年再+1,因为闰年是52周多2天。
闰年数量是:能整除4-能整除100+能整除400。
因此星期数就是:往年年数+闰年数+当年的日期天数,对7取余数可得!
简单来说就是把以往各年非整周的剩余天数累加,再加上当年天数来除以七。
平年余数累积1天,闰年累积2天。
星期计算步骤:
1、判断闰年leap(1闰0平);y为年
set/a "leap=!(y%%4)&!!(y%%100)|!(y%%400)"
2、计算2月天数t2
set/a t2=28+leap
3、计算指定日期是当年第几天t;m为月,d为日
set/a m3=(m-1)*3
set E=+31+t2+31+30+31+30+31+31+30+31+30+31 //基于余数思想,这句是不是也可以简化缩短?
set/a t=0!E:~,%m3%!+d
4、计算星期w(0为周日);y1为上一年
set/a w=(y1/4-y1/100+y1/400+y1+t)%%7
注:基姆拉尔森计算公式中部分参数的含义不易理解。所以自己写了个一天一天累加的方法,原理比较简单易懂!
第几周计算原理与步骤就留给大家思考吧^_^
作者: cutebe 时间: 2021-1-22 23:48
本帖最后由 cutebe 于 2021-1-22 23:50 编辑
计算星期的做成函数- ::计算指定日期是星期几,函数:weekday
- @echo off
- setLocal enableDelayedExpansion
-
- set idate=%date%
- call :picknum idate today
- call :weekday today wd
- echo/ 今天是周%wd%
-
- set idate=2021-01-23
- set fdate=%idate:-=%
- call :weekday fdate wd
- set week=天一二三四五六
- echo/ %idate%是星期!week:~%wd%,1!
-
- pause
- goto :eof
-
- ::提取字串中的数字
- :picknum str numstr
- setlocal
- set "str=!%1!"
- for /l %%n in (0,1,9)do set _%%n=1
- :_picknext
- if defined _%str:~,1% set num=%num%%str:~,1%
- set str=%str:~1%
- if not "%str%"=="" goto :_picknext
- endlocal&set %2=%num%
- goto :eof
-
- ::计算日期的星期。参数YYYYMMDD,输出0-6
- :weekday formatdate dayofweek
- setlocal
- set "fdate=!%1!"
- set/a y=1%fdate:~,4%-10000,m=1%fdate:~4,2%-100,d=1%fdate:~6,2%-100
- set/a y1=y-1,m3=(m-1)*3
- set/a "leap=^!(y%%4)&^!^!(y%%100)|^!(y%%400)",T2=28+leap
- set daysofmonth=+31+T2+31+30+31+30+31+31+30+31+30+31
- set/a daysnum=0!daysofmonth:~,%m3%!+d
- set/a wday=(y1/4-y1/100+y1/400+y1+daysnum)%%7
- endlocal&set %2=%wday%
- goto :eof
复制代码
作者: cutebe 时间: 2021-1-22 23:54
计算第几周的也做成函数- ::计算指定日期是当年第几周,函数:weekord
- @echo off
- setLocal enableDelayedExpansion
-
- set idate=%date%
- call :picknum idate today
- call :weekord today wo
- echo/ 今天是今年第%wo%周
-
- set idate=2021-01-23
- set fdate=%idate:-=%
- call :weekord fdate wo
- echo/ %idate%是当年第%wo%周
-
- pause
- goto :eof
-
- ::提取字串中的数字
- :picknum str numstr
- setlocal
- set "str=!%1!"
- for /l %%n in (0,1,9)do set _%%n=1
- :_picknext
- if defined _%str:~,1% set num=%num%%str:~,1%
- set str=%str:~1%
- if not "%str%"=="" goto :_picknext
- endlocal&set %2=%num%
- goto :eof
-
- ::计算日期是当年第几周。参数YYYYMMDD,输出1-54
- :weekord formatdate weekordinal
- setlocal
- set "fdate=!%1!"
- set/a y=1%fdate:~,4%-10000,m=1%fdate:~4,2%-100,d=1%fdate:~6,2%-100
- set/a y1=y-1,m3=(m-1)*3
- set/a "leap=^!(y%%4)&^!^!(y%%100)|^!(y%%400)",T2=28+leap
- set daysofmonth=+31+T2+31+30+31+30+31+31+30+31+30+31
- set/a daysnum=0!daysofmonth:~,%m3%!+d,daysmore=y1/4-y1/100+y1/400+y1
- set/a wday0=daysmore%%7,wday=(daysmore+daysnum)%%7
- set/a weeko=(wday0+daysnum+(7-wday)%%7)/7
- endlocal&set %2=%weeko%
- goto :eof
复制代码
作者: Batcher 时间: 2021-1-24 19:35
感谢分享!
有兴趣的朋友也可以参考另外几个例子:日期、星期、时间等
http://bbs.bathome.net/thread-3056-1-1.html
作者: jave000 时间: 2022-3-4 11:34
win10不支持weekord么,无法显示第几周
作者: jave000 时间: 2022-3-4 11:48
本帖最后由 jave000 于 2022-3-4 11:55 编辑
我需要根据当前周数创建对应文件夹,这个参数不支持的样子
The system cannot find the batch label specified - picknum
The system cannot find the batch label specified - weekday
作者: Batcher 时间: 2022-3-4 12:54
回复 6# jave000
批处理函数库里面有计算日期、星期、时间等实例
http://bbs.bathome.net/thread-3056-1-1.html
请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |