【问题标题】:Append +1 to date in batch file在批处理文件中追加 +1 到日期
【发布时间】:2013-08-08 18:18:57
【问题描述】:

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

@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%

【问题讨论】:

    标签: file date batch-file


    【解决方案1】:

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

    Paul Tomasi has posted a rather brilliant script on his site 他完整地解释了它,甚至包括流程图。

    ::================================================
    :: 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%
    
    ::------------------------------------------------
    

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

    希望这会有所帮助!

    【讨论】:

    • 此脚本如何处理不同天数(例如 28、29、30)的 mont?
    【解决方案2】:
    @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

    【讨论】:

    • 您好 Endoro,我在运行您的代码示例时遇到以下错误:code ** 今天是 Thu 08/08/2013 号码无效。数字常量可以是十进制 (17)、十六进制 (0x11) 或八进制 (021)。这是没有的日子。明天是没有的日子。 1 明天是 25.11.-4713**
    • @user2665516 date 格式取决于本地设置(您的国家/地区设置)。我的日期格式是dd.mm.yyyy,你可以在脚本的输出部分看到。
    • 这些选项都不适合我,使用 PowerShell 也不是一个选项。我最终做的是使用 VBScript 以我想要的格式创建日期。然后我还即时创建了 .batch 文件。由于我的帐户是新帐户,它不会让我回答我的问题。稍后我会尝试发布解决方案。
    • @YoungDev 您可以根据您的日期格式调整我的代码。即使我知道,我也能做到。
    • 我有点紧张,这并不能完美地实现 Julian Date 转换。如果圣诞节/闰年失败,我会试一试,然后回来;)
    【解决方案3】:

    抱歉,我不知道你在用你的 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-08 12:00:00”的输出。我只需要在日期后面加上+1。我不熟悉powershell,但我不会不介意尝试。我发布的代码只是批处理文件操作的一部分,它使用此日期作为输入变量。powershell 可以在批处理文件中执行吗?
    • 对不起,看我编辑的答案,cmets 的空间太小了。但是,我不知道如何将输出恢复到批处理中。
    【解决方案4】:

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

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

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

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

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

    我在此处的其他地方找到了解决方案(请参阅dealing with octal variables in batch script),您必须添加然后减去 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%
    
    ::------------------------------------------------
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 2015-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多