【问题标题】:Subtract days in batch file减去批处理文件中的天数
【发布时间】:2020-11-04 17:56:07
【问题描述】:

我会尝试从今天的日期减去 60 天,但我不知道该怎么做。

我的约会对象是这样的:

@echo off
pause

SET currentYear=%date:~9,4%
ECHO %currentYear%
SET month=%date:~6,2%
ECHO %month%
SET day=%date:~3,2%
SET date=%day%%month%%currentYear%

ECHO %day%
ECHO %date%

pause

我浏览过互联网,但没有找到简单实用的东西!

【问题讨论】:

标签: windows date batch-file cmd


【解决方案1】:

试试这个:

@echo off
setlocal

Call :GetDateTime Year Month Day
Echo %Year% %Month% %Day%
Call :SubtractDate %Year% %Month% %Day% -60 Ret
echo %Ret%
exit /b


:SubtractDate Year Month Day <+/-Days> Ret
::Adapted from DosTips Functions::
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=%MM: =%/%DD: =%/%YYYY: =%
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
     IF "%~1" NEQ "" set "%~1=%YYYY%" 
     IF "%~2" NEQ "" set "%~2=%MM%" 
     IF "%~3" NEQ "" set "%~3=%DD%"
     IF "%~4" NEQ "" set "%~4=%HH%" 
     IF "%~5" NEQ "" set "%~5=%Min%"
     IF "%~6" NEQ "" set "%~6=%Sec%"
)
exit /b

【讨论】:

  • 我只是改变这个:for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "YY =%dt:~2,2%" & 设置 "YYYY=%dt:~0,4%" & 设置 "MM=%dt:~4,2%" & 设置 "DD=%dt:~6,2 %" ( ENDLOCAL IF "%~1" NEQ "" set "%~1=%YYYY%" IF "%~2" NEQ "" set "%~2=%MM%" IF "%~3" NEQ " " set "%~3=%DD%" ) 退出 /b
  • @MattWilliamson 我在运行此程序时收到1JDa:~1JDa:~1 was unexpected at this time.,可能来自这一行:if %a:~0,1% equ + (set /a JD=%JD%+%a:~1%) else set /a JD=%JD%-%a:~1%。我不知道如何摆脱警告。有什么想法吗?
【解决方案2】:

这是一个强大的通用批处理文件 - 如果您想将它包含在另一个批处理文件中,它可以减少到 8 行左右。

你会使用类似的东西:datetime.bat today -60

:: Date forward & backward
@echo off
if "%~2"=="" (
echo to get todays date use         call "%~n0" today 0
echo to get yesterdays date use     call "%~n0" today -1
echo to get 25 days before 19441213 call "%~n0" 1944/12/13 -25
echo to get 1250 days in the future call "%~n0" today 1250
echo.
echo Add a third parameter if you want a separator in the date string
echo EG: for this format YYYY-MM-DD using today's date
echo     call "%~n0" today 0 -
echo.
pause
goto :EOF)

set date1=%1
set qty=%2
set separator=%~3
if /i "%date1%" EQU "TODAY" (set date1=now) else (set date1="%date1%")
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%qty%,%date1%)
echo>>"%temp%\%~n0.vbs" d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^&_
echo>>"%temp%\%~n0.vbs"         right(100+month(s),2)^&_
echo>>"%temp%\%~n0.vbs"         right(100+day(s),2)^&_
echo>>"%temp%\%~n0.vbs"         d
for /f %%a in ('cscript //nologo "%temp%\%~n0.vbs"') do set result=%%a
del "%temp%\%~n0.vbs"
endlocal& (
set "YY=%result:~0,4%"
set "MM=%result:~4,2%"
set "DD=%result:~6,2%"
set "daynum=%result:~-1%"
)
if %daynum% EQU 1 set "weekday=Sunday"
if %daynum% EQU 2 set "weekday=Monday"
if %daynum% EQU 3 set "weekday=Tuesday"
if %daynum% EQU 4 set "weekday=Wednesday"
if %daynum% EQU 5 set "weekday=Thursday"
if %daynum% EQU 6 set "weekday=Friday"
if %daynum% EQU 7 set "weekday=Saturday"

set "day=%YY%%separator%%MM%%separator%%DD%"
echo %%day%% is set to "%day%" (without the quotes)
echo %%YY%% is set to %YY%
echo %%MM%% is set to %MM%
echo %%DD%% is set to %DD%
echo The weekday turns out to be: %weekday%
pause

【讨论】:

    【解决方案3】:

    也可以通过嵌入到 cmd 脚本中的 jscript 代码来完成:

    这是dayM.bat,它只接受一个参数 - 您想要添加到当前日期并打印结果的天数:

      @if (@X) == (@Y) @end /* JScript comment 
        @echo off   
        cscript //E:JScript //nologo "%~f0" %*
        exit /b %errorlevel%       
    @if (@X)==(@Y) @end JScript comment */
    
    var days=parseInt(WScript.Arguments.Item(0));
    
    
    Date.prototype.addDays = function(days) {
        var date = new Date(this.valueOf());
        date.setDate(date.getDate() + days);
        return date;
    }
    
    var date = new Date();
    
    WScript.Echo(date.addDays(5));
    WScript.Echo("Year: " + date.getFullYear());
    WScript.Echo("Month: " + date.getMonth());
    WScript.Echo("DayOfTeWEek: " + date.getDay());
    

    示例:

    E:\scripts>dayM.bat 7
    Sun Nov 8 16:27:48 UTC+0200 2020
    Year: 2020
    Month: 10
    DayOfTeWEek: 2
    DayOfTheMonth: 3
    

    您可以以适合您的方式对其进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多