2012-08-09 126 views
6

我知道如何让今天的日期在Windows 7这里是我使用的命令:如何获得昨天的日期在批处理文件

%DATE:~6,4%%DATE:~3,2%%DATE:~0,2% 

但我想,昨天我不知道怎么样。

+0

http://www.robvanderwoude.com/datetimentmath.php – craig65535 2012-08-09 20:27:20

+1

谷歌搜索'DOS当第二个链接昨天date':http://www.binbert.com/blog/2010/07/previous-yesterdays- date-in-dos-batch-file/ – SeanC 2012-08-09 20:28:11

+0

当谷歌搜索日期扣除批处理文件时的第一个链接:http://stackoverflow.com/questions/355425/date-arithmetic-in-dos-scripting – Andrew 2012-08-09 21:04:50

回答

6

找到一个脚本,可以确保您获得前一天,即使年份或月份发生变化Dos Yesterday Batch

@echo off 

set yyyy= 

set $tok=1-3 
for /f "tokens=1 delims=.:/-, " %%u in ('date /t') do set $d1=%%u 
if "%$d1:~0,1%" GTR "9" set $tok=2-4 
for /f "tokens=%$tok% delims=.:/-, " %%u in ('date /t') do (
for /f "skip=1 tokens=2-4 delims=/-,()." %%x in ('echo.^|date') do (
set %%x=%%u 
set %%y=%%v 
set %%z=%%w 
set $d1= 
set $tok=)) 

if "%yyyy%"=="" set yyyy=%yy% 
if /I %yyyy% LSS 100 set /A yyyy=2000 + 1%yyyy% - 100 

set CurDate=%mm%/%dd%/%yyyy% 
set dayCnt=%1 

if "%dayCnt%"=="" set dayCnt=1 

REM Substract your days here 
set /A dd=1%dd% - 100 - %dayCnt% 
set /A mm=1%mm% - 100 

:CHKDAY 
if /I %dd% GTR 0 goto DONE 
set /A mm=%mm% - 1 
if /I %mm% GTR 0 goto ADJUSTDAY 
set /A mm=12 
set /A yyyy=%yyyy% - 1 

:ADJUSTDAY 
if %mm%==1 goto SET31 
if %mm%==2 goto LEAPCHK 
if %mm%==3 goto SET31 
if %mm%==4 goto SET30 
if %mm%==5 goto SET31 
if %mm%==6 goto SET30 
if %mm%==7 goto SET31 
if %mm%==8 goto SET31 
if %mm%==9 goto SET30 
if %mm%==10 goto SET31 
if %mm%==11 goto SET30 
REM ** Month 12 falls through 

:SET31 
set /A dd=31 + %dd% 
goto CHKDAY 

:SET30 
set /A dd=30 + %dd% 
goto CHKDAY 

:LEAPCHK 
set /A tt=%yyyy% %% 4 
if not %tt%==0 goto SET28 
set /A tt=%yyyy% %% 100 
if not %tt%==0 goto SET29 
set /A tt=%yyyy% %% 400 
if %tt%==0 goto SET29 

:SET28 
set /A dd=28 + %dd% 
goto CHKDAY 

:SET29 
set /A dd=29 + %dd% 
goto CHKDAY 

:DONE 
if /I %mm% LSS 10 set mm=0%mm% 
if /I %dd% LSS 10 set dd=0%dd% 

REM Set IIS and AWS date variables 
set IISDT=%yyyy:~2,2%%mm%%dd% 
set AWSDT=%yyyy%-%mm%-%dd% 
3
@echo off 
:: Strip the day of the week from the current date 
FOR %%A IN (%Date%) DO SET Today=%%A 
:: Parse the date, prefix day and month with an extra leading zero 
FOR /F "tokens=1-3 delims=/" %%A IN ("%Today%") DO (
    SET Day=0%%A 
    SET Month=0%%B 
    SET Year=%%C 
) 
:: Remove excess leading zeroes 
SET Day=%Day:~-2% 
SET Month=%Month:~-2% 
:: Display the results 
SET Day 
SET Month 
SET Year 
:: Convert to Julian date 
CALL :JDate %Year% %Month% %Day% 
:: Display the result 
SET JDate 
:: Subtract 1 day 
SET /A JPast = JDate - 1 
:: Display the result 
SET JPast 
:: Convert back to "normal" date again 
CALL :GDate %JPast% 
:: Display the result 
::SET GDate=20130121 
SET GDate 

echo The previous day in form YYYYMMDD is %GDate% 

pause 
:::::::::::::::::::::::::::::::::::::::::::::::::::::: 

GOTO:EOF 

:JDate 
:: Convert date to Julian 
:: Arguments : YYYY MM DD 
:: Returns : Julian date 
:: 
:: First strip leading zeroes 
SET MM=%2 
SET DD=%3 
IF %MM:~0,1% EQU 0 SET MM=%MM:~1% 
IF %DD:~0,1% EQU 0 SET DD=%DD:~1% 
:: 
:: Algorithm based on Fliegel-Van Flandern 
:: algorithm from the Astronomical Almanac, 
:: provided by Doctor Fenton on the Math Forum 
:: (http://mathforum.org/library/drmath/view/51907.html), 
:: and converted to batch code by Ron Bakowski. 
SET /A Month1 = (%MM% - 14)/12 
SET /A Year1 = %1 + 4800 
SET /A JDate = 1461 * (%Year1% + %Month1%)/4 + 367 * (%MM% - 2 -12 * %  Month1%)/12 - (3 * ((%Year1% + %Month1% + 100)/100))/4 + %DD% - 32075 

SET Month1= 
SET Year1= 
GOTO:EOF 
:GDate 
:: Convert Julian date back to "normal" Gregorian date 
:: Argument : Julian date 
:: Returns : YYYY MM DD 
:: 
:: Algorithm based on Fliegel-Van Flandern 
:: algorithm from the Astronomical Almanac, 
:: provided by Doctor Fenton on the Math Forum 
:: (http://mathforum.org/library/drmath/view/51907.html), 
:: and converted to batch code by Ron Bakowski. 
:: 
SET /A P  = %1 + 68569 
SET /A Q  = 4 * %P%/146097 
SET /A R  = %P% - (146097 * %Q% +3)/4 
SET /A S  = 4000 * (%R% + 1)/1461001 
SET /A T  = %R% - 1461 * %S%/4 + 31 
SET /A U  = 80 * %T%/2447 
SET /A V  = %U%/11 
SET /A GYear = 100 * (%Q% - 49) + %S% + %V% 
SET /A GMonth = %U% + 2 - 12 * %V% 
SET /A GDay = %T% - 2447 * %U%/80 
:: Clean up the mess 
FOR %%A IN (P Q R S T U V) DO SET %%A= 
:: Add leading zeroes 
IF 1%GMonth% LSS 20 SET GMonth=0%GMonth% 
IF 1%GDay% LSS 20 SET GDay=0%GDay% 
:: Return value 
:: Here you can define the form that you want 
SET GDate=%GYear%%GMonth%%GDay% 
GOTO:EOF 
9

如果你只限于只是cmd.exe,那么其他的解决方案,尽管它们的大小,可能是一样好,你会得到。然而,现代Windows(例如Win7)带有不少其他工具,这些工具可以更轻松地完成工作。

只需创建一个VBScript yester.vbs脚本如下:

d = date() - 1 
wscript.echo year(d) * 10000 + month(d) * 100 + day(d) 

然后你可以从你的cmd脚本中调用它:

for /f %%a in ('cscript //nologo yester.vbs') do set yesterday=%%a 

yesterday变量的形式yyyymmdd的创建不管你的愿望如何操纵。

1

下面是一个解决方案,用于即时创建earlierday.vbs文件,使用它并在之后删除它。

它并将结果存储在变量NewDate

本示例计算1天前,但可以很容易地计算出的日期进一步向后通过改变偏移变量的值。

@echo off 
set Offset=1 

echo d = date() - WScript.Arguments.Item(0) > earlierday.vbs 
echo wscript.echo year(d) * 10000 + month(d) * 100 + day(d) >> earlierday.vbs 

for /f %%a in ('cscript //nologo earlierday.vbs %Offset%') do set NewDate=%%a 

del earlierday.vbs  
echo %NewDate% 
pause 

通过使用%temp%\ earlierday.vbs在用户的临时文件夹中创建文件,可以稍微优化一下。

致谢paxdiablo因为这是他早期发表的一个简单的调整。

编辑:这里有一个循环,接近我真正需要它做的事情。这将需要14天的日期,并返回该日期。然后它会一直保持7天,直到它在一天前的35天。

@echo off 
SETLOCAL EnableDelayedExpansion 

set BackDaysFrom=14 
Set BackDaysTo=35 
Set BackDaysStep=7 

echo d = date() - WScript.Arguments.Item(0) > earlierday.vbs 
echo wscript.echo year(d) * 10000 + month(d) * 100 + day(d) >> earlierday.vbs 

for /L %%i in (%BackDaysFrom%, %BackDaysStep%, %BackDaysTo%) do (
    for /f %%a in ('cscript //nologo earlierday.vbs %%i') do set NewDate=%%a 
    echo !NewDate! 
) 

del earlierday.vbs  

pause 
相关问题