获取当前日期和前一天
问题描述:
我正在尝试获取StartDate(Today)和EndDate(Yesterday)。我一直在努力保持数字格式正确的一天。然而,我注意到,系统不喜欢什么时候有一个前导零,当它从“09”减去1时失败,但与“10”完美匹配。我怎样才能解决这个问题?获取当前日期和前一天
echo off
REM CurrentDate (END DATE) -------------------------------------------------------------
Set dd=%date:~4,2%
Set mm=%date:~7,2%
Set yyyy=%date:~10,4%
set END_DATE=%yyyy%-%mm%-%dd% 00:00 AM
echo %END_DATE%
REM CurrentDate - 1 (START DATE) ------------------------------------------------------------
set m1dd=%date:~4,2%
set m1dd=09
echo %m1dd%
set /A m1dd -= 1
echo %m1dd%
Set m1dd=0%m1dd%
echo %m1dd%
Set m1dd=%m1dd:~-2%
echo %m1dd%
set START_DATE=%yyyy%-%mm%-%m1dd% 00:00 AM
echo %START_DATE%
pause
答
此批处理文件使用一个小窍门,用XCOPY命令来验证日期实际上是一个有效的日期,因为您从YYYYMMDD中减去1。
@echo off
setlocal
set rand=%random%
md "dummy%rand%\empty%rand%"
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set /a y=%dt:~0,4%
set /a m=1%dt:~4,2%
set /a d=1%dt:~6,2%
REM set the number of days to substract
SET DAYS=1
FOR /L %%G IN (1,1,%days%) DO CALL :loop
set subdate=%y%%m:~-2%%d:~-2%
echo Today is: %dt:~0,8%
echo Yesterday was: %subdate%
rd /s /q "dummy%rand%"
pause
endlocal
GOTO :EOF
:loop
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 "dummy%rand%\empty%rand%" "dummy%rand%" >nul 2>&1 || goto loop
GOTO :EOF
输出
Today is: 20170905
Yesterday was: 20170904
Press any key to continue . . .
答
你做日期计算的方式是不理想的。为了更好的日期计算,你可以参考这个link。
如果你只是寻找一个快速的修复,使当前的代码运行,只需删除前导零如下:
echo off
REM CurrentDate (END DATE) -------------------------------------------------------------
Set dd=%date:~4,2%
Set mm=%date:~7,2%
Set yyyy=%date:~10,4%
set END_DATE=%yyyy%-%mm%-%dd% 00:00 AM
echo %END_DATE%
REM CurrentDate - 1 (START DATE) ------------------------------------------------------------
set m1dd=%date:~4,2%
set m1dd=09
set /a m1dd=100%m1dd% %% 100
echo %m1dd%
set /a m1dd -= 1
echo %m1dd%
Set m1d=0%m1dd%
echo %m1dd%
Set m1d=%m1dd:~-2%
echo %m1dd%
set START_DATE=%yyyy%-%mm%-%m1dd% 00:00 AM
echo %START_DATE%
pause
答
你可以利用来自您的批处理文件的PowerShell:
@Echo Off
Set "TS=.ToString('yyy-MM-dd') + \" 00:00 AM\""
For /F "UseBackTokens=1*[email protected]" %%A In (`
PowerShell "(Get-Date)%TS% + \"@\" + (Get-Date).AddDays(-1)%TS%"`
) Do Set "TD=%%A" & Set "YD=%%B"
Echo %%TD%% = %TD%
Echo %%YD%% = %YD%
Timeout -1
+0
是用于混淆或缩短的'%TS%' - 好像它同时适用于;-) +1 – LotPings
说明了反对票,请让我可以学习和创造美好未来的问题吗?谢谢。 – Amasian21
在开始之前如何结束? – Compo
主要你应该在发帖之前研究你的主题,在上面的搜索框中键入'batch yesterday',你会得到很多结果。 – LotPings