批处理脚本-如何获取一年中每个星期一的日期

时间:2018-08-27 16:56:05

标签: batch-file scripting

我想使用批处理脚本获取一年中每个星期一的日期列表。

样本输入:

2018

示例输出:

2018-01-01
2018-01-08
2018-01-15
2018-01-22
2018-01-29
...
2018-12-03
2018-12-10
2018-12-17
2018-12-24
2018-12-31

我发现以下帖子返回了每个月的最后一个星期日的日期: https://rosettacode.org/wiki/Find_the_last_Sunday_of_each_month#Batch_File

我试图对其进行修改,但是它似乎无法满足我的要求。

我还考虑获取一年中的第一个星期一日期,并在该日期前加上7个循环,直到年底。但是,我正在努力寻找一个榜样。

非常感谢您的帮助。

谢谢

丹尼尔

1 个答案:

答案 0 :(得分:0)

我通常会忽略没有显示OP做出任何努力的“问题”。但是,在这种情况下,我做了一个例外,但是我没有做出任何努力来解释代码...

@echo off
setlocal EnableDelayedExpansion

rem Define the "Date to Julian Day Number" and vice versa conversion functions
set "DateToJDN(YMD)=( a=(YMD), y=a/10000, a%%=10000, m=a/100, d=a%%100, a=(m-14)/12, (1461*(y+4800+a))/4+(367*(m-2-12*a))/12-(3*((y+4900+a)/100))/4+d-32075 )"
set "JDNtoDate(JDN)=( a=(JDN), l=a+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,d=l-(2447*j)/80,l=j/11,m=j+2-(12*l),y=100*(n-49)+i+l,y*10000+m*100+d )"

rem Get the date of first and last mondays in the year
set /A "first=!DateToJDN(YMD):YMD=%10101!, first-=first%%7, last=first+371"

rem Show the date of all mondays
for /L %%a in (%first%,7,%last%) do (
   set /A "D=!JDNtoDate(JDN):JDN=%%a!"
   if "!D:~0,4!" equ "%1" echo !D:~0,4!-!D:~4,2!-!D:~6,2!
)

将输入年份放置在“批处理”文件参数中。在this answer

上的更多详细信息