我正在使用以下代码在批处理文件中获取当前周的两位数。
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mm=%%a&set dd=%%b&set yy=%%c)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,Jd=153*m+2
set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
if %cw% LSS 10 set cw=0%cw%
但是,我想修改代码,以便显示前一周的两位数。您能建议我该如何更改代码才能获得此结果吗?
答案1
通常情况下,你只需从中减去一%cw%
,
但有两个可能的陷阱,
- 前导零会导致该数字被解释为八进制,并且 08/09 会出现错误;
- 如果
%cw%
是 1,则没有第 0 周,而是上一年的第 52/53 周
要解决问题 1:
set /A cw=1%cw%-101
set "cw=0%cw%"
set "cw=%cw:~-2%"
或者替换倒数第二行你的代码
set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
和 :
set /a diff=Jd-Jr,cw=diff/7,wd=diff%%7,wd+=1
这仍然可以返回 00 的 cw。
由于您的代码可能源自Ritchie Lawrence 批处理函数库最好的办法是:
- 使用 wmic 或 powershell 以更可靠的方式获取当前日期。
- 将日期转换为数字库函数DateToMJD
- 从该数字中减去 7
- 使用库函数 MJDtoDate 转换回来
- 最后使用具有年份、星期、星期几部分的库函数 DateToWeek。
按照 ISO8601 的规定,12 月 29 日至 31 日/1 月 1 日至 3 日的周数可以属于其他年份,因此周数应始终与年份结合在一起。