4

我有一个批处理文件,可以很好地创建今天的日期。现在我需要更新它以显示明天的日期。任何帮助深表感谢:

@echo off
set TimeStamp=12:00:00


FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B

FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B

FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B

FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B

SET date="%yyyy%-%mm%-%dd% %TimeStamp%"

echo %date%
4

4 回答 4

6

“问题”是您需要考虑二月、闰年等。

Paul Tomasi 在他的网站上发布了一个相当出色的脚本,在那里他完整地解释了它,甚至包括一个流程图。

::================================================
:: TOMORROW.BAT - Written by Paul Tomasi (c)2010
::
:: Function to return tomorrow's date
::================================================
@echo off

set /a d=%date:~0,2%
set /a m=%date:~3,2%
set /a y=%date:~6,4%

:loop
   set /a d+=1

   if %d% gtr 31 (
      set d=1
      set /a m+=1

      if %m% gtr 12 (
         set m=1
         set /a y+=1
      )
   )

xcopy /d:%m%-%d%-%y% /h /l "%~f0" "%~f0\" >nul 2>&1 || goto loop

echo %d%/%m%/%y%

::------------------------------------------------

Paul Tomasi 的流程图批处理时间计算

所以要么是这个,要么是潜入混合批处理脚本。

希望这可以帮助!

于 2013-08-08T18:30:53.040 回答
3
@echo off &SETLOCAL
SET "today=%date%"
ECHO(today is       %today%
CALL:DateToJDN %today% todayNo
ECHO(this is day no.        %todayNo%
SET /a tomorrowNo=todayNo+1
ECHO(tomorrow is day no.    %tomorrowNo%
CALL:JDNToDate %tomorrowNo% tomorrow
ECHO(tomorrow is        %tomorrow%
GOTO:EOF

rem Convert the date to Julian Day Number

:DateToJDN dd.mm.yyyy jdn=
setlocal
set date=%1
set /A yy=%date:~-4%, mm=1%date:~-7,2% %% 100, dd=1%date:~-10,2% %% 100
set /A a=mm-14, jdn=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075
endlocal & set %2=%jdn%
exit /B

rem Convert Julian Day Number back to date

:JDNToDate jdn dd.mm.yyyy=
setlocal
set /A l=%1+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447,dd=l-(2447*j)/80,l=j/11,mm=j+2-(12*l),yy=100*(n-49)+i+l
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%
endlocal & set %2=%dd%.%mm%.%yy%
exit /B

endlocal

今天是 08.08.2013
这是没有的日子。2456513
明天是没有的日子。2456514
明天是 09.08.2013
于 2013-08-08T18:56:49.903 回答
1

抱歉,我不知道你在用你的 Batch 代码做什么。你能评论一下吗?为什么需要 12:00 的时间戳?

在我的德语版本中,它告诉我:

"eingeschaltet-- 12:00:00"

跑完之后

(eingeschaltet 的意思是“打开”或“设置”等)

Powershell 会是一种选择吗?你会保存你的理智...

$Today = Get-Date
$Tomorrow = $Today.AddDays(1)

Write-Host "Tomorrow: $Tomorrow"

是的,您可以从 Batch 启动 Powershell 脚本:

启动Powershell并输入“Set-ExecutionPolicy Unrestricted”

(或者签署你的脚本,如果其他人需要运行它)你现在可以关闭 Powershell,我们只需要它来完成这个一次性步骤

在您的批处理中(假设您的脚本名为“Add-Days.ps1”)

set script="Add-Days.ps1"
powershell.exe -NoProfile -File "%script%"
于 2013-08-08T18:24:43.500 回答
0

我喜欢 Paul Tomasi 的解决方案(由 GitaarLAB 提出),但我发现它有一个小错误,即它不适用于一个月的“08”和“09”天。

这是因为前导零表示系统认为它们是无效的八进制数,因此使用以下语句:

set /a d=%date:~0,2%

它会生成以下系统日期错误,例如 08/03/2017 或 09/03/2017(假设日期为 dd/mm/yyyy 格式):

无效号码。数字常量可以是十进制 (17)、十六进制 (0x11) 或八进制 (021)。

我在这里的其他地方找到了解决方案(请参阅处理批处理脚本中的八进制变量),您必须添加然后减去 100 来处理前导零,根据此语句:

set /a d=(1%d: =0%-100)

这是完整的更新脚本:

::=====================================================
:: TOMORROW.BAT - Written by Paul Tomasi (c)2010
::
:: Function to return tomorrow's date
::    
:: updated to work for 08 and 09 days of the month
::             and for 08 and 09 months of the year
::=====================================================
@echo off

set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%

set /a d=(1%d: =0%-100)
set /a m=(1%m: =0%-100)

:loop

   if %d% gtr 31 (
      set d=1
      set /a m+=1

      if %m% gtr 12 (
         set m=1
         set /a y+=1
      )
   )

xcopy /d:%m%-%d%-%y% /h /l "%~f0" "%~f0\" >nul 2>&1 || goto loop

echo %d%/%m%/%y%

::------------------------------------------------
于 2017-03-09T16:15:47.390 回答