如何从此 cmd 代码中减去 1 天:
%date:~10,4%%date:~4,2%%date:~7,2%
我在这里看到的每一篇文章都说我需要使用 power shell 等。我只想从这里删除 1 天。
cmd 返回:
20180227
我愿意:
20180226
我不了解编码,但这对我有用:
set YY=%date:~10,4%
set MM=%date:~4,2%
set DD=%date:~7,2%
set /a DD1= %DD% - 1
echo %YY%%MM%%DD1%
这里有两个代码选项。 我正在使用两者中的函数来获取当前日期和时间。 如果您不需要,可以将其删除。
这是两个选项中最快的。它将日期转换为儒略日期以进行数学计算,然后将其转换回正常日期。
@echo off
setlocal
REM Get the current date
REM Will return variables YY, YYYY, MM, DD, HH, Min and Sec
Call :GetDateTime
REM Add or Subtract from the current date
REM Must use + or - symbol
REM Revised date will be assigned to RetVar
REM LeapDay
Call :AddSubDate 2016 03 01 -1 LeapDay
REM Yesterday
Call :AddSubDate %YYYY% %MM% %DD% -2 past
REM Tomorrow
Call :AddSubDate %YYYY% %MM% %DD% +2 future
echo LeapDay : %LeapDay%
echo Past : %past%
echo Today : %YYYY%%MM%%DD%
echo Future : %future%
pause
GOTO :EOF
:AddSubDate Year Month Day <+/-Days> RetVar
setlocal & set a=%4
set "yy=%~1"&set "mm=%~2"&set "dd=%~3"
set /a "yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100"
if %yy% LSS 100 set /a yy+=2000 &rem Adds 2000 to two digit years
set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4
if %a:~0,1% equ + (set /a JD=%JD%+%a:~1%) else set /a JD=%JD%-%a:~1%
set /a L= %JD%+68569, N= 4*L/146097, L= L-(146097*N+3)/4, I= 4000*(L+1)/1461001
set /a L= L-1461*I/4+31, J= 80*L/2447, K= L-2447*J/80, L= J/11
set /a J= J+2-12*L, I= 100*(N-49)+I+L
set /a YYYY= I, MM=100+J, DD=100+K
set MM=%MM:~-2% & set DD=%DD:~-2%
set ret=%YYYY: =%%MM: =%%DD: =%
endlocal & set %~5=%ret%
exit /b
:GetDateTime Year Month Day Hour Minute Second
@echo off & setlocal
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
( ENDLOCAL
set "YY=%YY%"
set "YYYY=%YYYY%"
set "MM=%MM%"
set "DD=%DD%"
set "HH=%HH%"
set "Min=%Min%"
set "Sec=%Sec%"
)
exit /b
第二个选项使用 xcopy 命令的技巧来检查日期是否是有效日期。 因此,从技术上讲,它并没有像之前的解决方案那样进行任何日期数学运算,而是转换为儒略日期来进行日期数学运算。该选项仅进行减法运算。 第一个选项可以加或减。
@echo off
setlocal
REM set the number of days to substract
SET DAYS=180
REM Call function to check if the date is valid.
CALL :validdate "%days%" subdate
echo Old date: %subdate%
pause
endlocal
GOTO :EOF
:validdate
setlocal
set "day=%~1"
set rand=%random%
md "%temp%\dummy%rand%\empty%rand%"
REM Get todays date
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
REM set year month and day into its own variables.
set /a y=%dt:~0,4%
set /a m=1%dt:~4,2%
set /a d=1%dt:~6,2%
:loop
if "%day%"=="0" (
rd /s /q "%temp%\dummy%rand%"
endlocal &set "%~2=%y%%m:~-2%%d:~-2%"
GOTO :EOF
)
set /a d-=1
if %d% lss 101 (
set d=131
set /a m-=1
if %m% lss 101 (
set m=112
set /a y-=1
)
)
xcopy /d:%m:~-2%-%d:~-2%-%y% /t "%temp%\dummy%rand%\empty%rand%" "%temp%\dummy%rand%" >nul 2>&1 && (set /a day-=1 & goto loop) || goto loop
GOTO :EOF
批处理脚本不支持开箱即用的日期/时间计算。因此,更简单的方法是将 .net 或 wsh 代码包装到批处理文件中 - 它将在任何 Windows 计算机上运行,无需安装额外的工具
**1)** Here's a script called `yesterday.bat` which is a batch file with embedded wsh/jscript code:
@if (@x)==(@y) @end /***** jscript comment ******
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b 0
@if (@x)==(@y) @end ****** end comment *********/
var d = new Date();
d.setDate(d.getDate() - 1);
var mm=(d.getMonth())+1
if (mm<10){
mm="0"+mm;
}
var dd=d.getDate();
if (dd<10) {
dd="0"+dd;
}
WScript.Echo(d.getFullYear()+""+mm+""+dd);
你可以这样使用它
for /f %%a in ('yesterday.bat') do set "ystd=%%a"
2) 这是您很可能已经安装的带有 powershell 的单行代码:
powershell "[DateTime]::Today.AddDays(-1).ToString("""yyyyMMdd""")"
您可以将其分配给批处理文件中的变量:
for /f %%a in ('powershell "[DateTime]::Today.AddDays(-1).ToString("""yyyyMMdd""")"') do set ystd=%%a
或者直接在命令提示符中:
for /f %a in ('powershell "[DateTime]::Today.AddDays(-1).ToString("""yyyyMMdd""")"') do set ystd=%a