首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >cmd脚本中的日期算法

cmd脚本中的日期算法
EN

Stack Overflow用户
提问于 2008-12-10 08:36:43
回答 6查看 92.1K关注 0票数 11

我需要编写一个脚本,将文件名从aDate.txt更改为bDate.txt,其中:

  • aDate是yyyymmdd格式的当前系统日期,
  • bDate是yyyymmdd格式的当前系统日期。

我目前有:

代码语言:javascript
复制
set yy=%date:~6,2%
set mm=%date:~3,2%
set dd=%date:~0,2%
if "%date:~6,1%"==" " set yy=0%yy:~1,1%
if "%date:~3,1%"==" " set mm=0%mm:~1,1%
if "%date:~0,1%"==" " set dd=0%dd:~1,1%
SET sys_date=20%yy%%mm%%dd%
ECHO %sys_date%
REM still have to do this bit properly
SET sys_date_yesterday=%sys_date%a
move %sys_date%.txt %sys_date_yesterday%.txt

但是我不知道如何做日期-1的事情(除了长篇大论),从日期减去1,如果是=0,那么从月份减去1,并将日期设置为新月份的最后一天,依此类推。

有什么想法吗?

EN

回答 6

Stack Overflow用户

发布于 2008-12-10 09:59:26

你必须用困难的方式去做。我建议使用SteveGTR的this解决方案。我复制下面的文本,因为至少我不能总是在该网站上看到解决方案。

这是我开发的一个批处理文件,用于从当前日期减去任意天数。它接受天数的命令行参数。默认值为1天(昨天):

代码语言:javascript
复制
@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%

echo Date %dayCnt% day(s) before %CurDate% is %mm%/%dd%/%yyyy%

祝你好运,史蒂夫

票数 5
EN

Stack Overflow用户

发布于 2016-07-23 00:48:56

使用Windows批处理脚本轻松添加或减去日期中的天数

这是我提出的一个使用批处理脚本计算日期(加或减)的解决方案。根据您的需要设置相应的变量,然后根据您的需要调整逻辑。这很好地满足了我的需求,并且都包含在同一个批处理脚本中,没有太多的逻辑。

要添加的您还可以使用此脚本,通过在:DynamicVBSScriptBuild例程中删除以下批处理脚本中的减号(**-**)符号,将天数添加到当前日期,因此,在您看到此,-%MinusDay%,的位置,只需删除减号,即可在每一行上获得,%MinusDay%,,现在MinusDay=变量值将等于您要添加的天数。

重要说明:当用MinusDays=值减去时,5个9 (99999)似乎是批处理脚本的限制。在使用MinusDays=值添加时,批处理脚本的限制似乎也是6个9 (999999)。

批处理脚本

代码语言:javascript
复制
@ECHO ON

::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay=2

:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A

::// Set your web server log file path in the below variable
SET WebServerLogPath=C:\WebServer\Logs

::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted
SET YYYY=%YYYY%
SET MM=%MM%
SET DD=%DD%

ECHO %YYYY%%MM%%DD%
PAUSE

GOTO EOF

:DynamicVBSScriptBuild
SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs
SET MMTmpVBS=%temp%\~tmp_mm.vbs
SET DDTmpVBS=%temp%\~tmp_dd.vbs
IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%"
IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%"
IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS%"
GOTO EOF

更多资源

票数 2
EN

Stack Overflow用户

发布于 2012-05-07 09:48:06

我需要一些东西,可以在检查闰年时从当前日期中减去天数,等等,这很有效。

我只是使用所需的参数(要减去的天数)从这些脚本中调用它,然后让它通过替换回调调用脚本,并将一个参数传递回修改(减去)日期的原始脚本。

下面是一些示例:

需要设置日期计算变量的脚本:

代码语言:javascript
复制
IF "%1"=="" goto modifydate

:modifydate
SET subtractdays=5
SET ModDateScript=\\servershare\path\Called_Scripts\ModDate.cmd
CALL "%ModDateScript%" %subtractdays% "%~fnx0"

该脚本将计算%moddata%参数并将其传递回原始调用脚本,以设置为变量,以便进行相应的处理。您只需将其放在您调用的脚本的末尾,以修改当前日期/从当前日期中减去日期(ModDate.cmd)。

代码语言:javascript
复制
SET moddate=%mm%/%dd%/%yyyy%
Call %2 %moddate%
GOTO EOF

我能够测试并确定原始脚本中的这些代码行是否发布:

代码语言:javascript
复制
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

可以仅用这一行来替换,并且它也同样有效:

代码语言:javascript
复制
FOR /F "tokens=2-4 delims=/ " %%A IN ("%date%") DO SET "mm=%%A" DO (& SET "dd=%%B") DO (& SET "yyyy=%%C")

请解释一下这些行(我用and语句改成只有一行)是做什么的,因为我不能很快地测试出区别。我退回到19世纪,它对我来说似乎是准确的。我认为它可能有助于处理修改后的年份将小于2000的计算--但我没有看到这一点,除非我遗漏了什么。

否则,可以很容易地调用这个脚本,并将%mm%/%dd%/%yyyy%作为参数传回给几个需要自己计算的脚本。非常好且非常高效的批处理解决方案。我可以将参数作为%1、%2、%3等进行传递,并且仍然在该脚本中使用当前日期的setlocal --只需创建一个类似moddate=%1等的变量即可。

最后,我向任何批处理脚本专家发起挑战,让他们进一步优化这个脚本,并将结果发布给批处理人员进行测试。

谢谢,P

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/355425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档