【问题标题】:Getting current day and day before获取当前日期和前一天
【发布时间】:2017-09-05 15:48:04
【问题描述】:

我正在尝试获取 StartDate(今天)和 EndDate(昨天)。我一直在努力保持当天的数字格式正确。然而,我注意到,系统不喜欢有前导零并且当它从“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

【问题讨论】:

  • 请解释一下否决票,以便我可以学习并在未来提出更好的问题?谢谢。
  • 什么事情还没开始就结束了?
  • 首先,您应该在发布之前研究您的主题,在上面的搜索框中输入batch yesterday,您会得到很多结果。
  • 在您的问题中“StartDate(今天)和 EndDate(昨天)”应该是“StartDate(昨天)和 EndDate(今天)”
  • Set Yesterday BATCH FILE的可能重复

标签: windows batch-file cmd


【解决方案1】:

这个批处理文件使用 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 . . .

【讨论】:

    【解决方案2】:

    您可以从批处理文件中使用 powershell:

    @Echo Off
    Set "TS=.ToString('yyy-MM-dd') + \" 00:00 AM\""
    For /F "UseBackTokens=1*Delims=@" %%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
    

    【讨论】:

    • %TS% 用于混淆或短路 - 好吧,它似乎同时适用于 ;-) +1
    【解决方案3】:

    您进行日期计算的方式并不理想。如需更好的日期计算,您可以参考此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
    

    【讨论】:

      【解决方案4】:

      我认为你应该将系统日期/时间格式修改为 yyyy/MM/DD

      Refer this post

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 2012-12-11
        • 2015-09-27
        • 2011-05-08
        • 1970-01-01
        • 2012-02-09
        • 2019-04-10
        • 2011-04-14
        • 1970-01-01
        相关资源
        最近更新 更多