批处理文件闰年?

时间:2016-02-02 15:46:02

标签: windows batch-file cmd

我应该如何创建批处理文件程序,如果我输入一年,程序将识别它是否是闰年。

@echo off
cls
echo.  LEAP YEAR
echo. Enter Year:
exit /b 0

嗯,这只是我需要帮助,比如我应该怎么做的建议。

3 个答案:

答案 0 :(得分:6)

@echo off
setlocal

set /P "year=Enter year: "
set /A "leap=!(year%%4) + (!!(year%%100)-!!(year%%400))"
if %leap% equ 1 echo Is leap year

相对于Wikipedia,如果它可以被4整除,那么它是一个跳跃,除非它也可以被100整除,在这种情况下它只有在它可以被400整除时才会跳跃("可分割&# 34;表示除以给定数字的余数为零)。这样,2000和2400是闰年,因为当它们除以400时它们的余数为零,但是2100,2200和2300不是:这些是特殊情况,因为当它们除以100时它们的余数为零。

set /A命令中,!布尔NOT运算符在其操作数为零时给出1,在任何其他情况下给出0,因此如果年份可以被4整除,则set /A "leap=!(year%%4)"给出1在任何其他情况下为零;这给出了结果的第一部分。

之后我们需要在2100年,2200年和2300年从这个值中减去1,但在2000年和2400年没有减去任何数据;那就是:

year    year%%100    a=!!(year%%100)    year%%400    b=!!(year%%400)    a-b
2000    0              0                0              0                 0
2100    0              0                100            1                 -1
2200    0              0                200            1                 -1
2300    0              0                300            1                 -1
2400    0              0                0              0                 0

如果年份可被100整除,则ab值均等于1,因此a-b为零,并给出结果只剩下4的原始余数。

这样,公式set /A "leap=!(year%%4) + (!!(year%%100)-!!(year%%400))"给出了完整的结果。

答案 1 :(得分:2)

它不会检查输入是否正确:

@echo off
set /p year=enter a year:

call :isLeap %year%

exit /b 0
:isLeap
setlocal

set "year=%~1"
set /a _4=year%%4
set /a _100=year%%100
set /a _400=year%%400

::set _

if not %_4% equ 0 (
  echo not leap
  exit /b 0
)

if %_100% equ 0 (

        if not %_400% equ 0 (
           echo not leap
           exit /b 0
        )
)

echo leap
exit /b 0

答案 2 :(得分:1)

您可能滥用PowerShell的日期构造函数。如果尝试将日期对象设置为 nnnn 的2月29日时出错,那么它不是闰年。

@echo off
setlocal

if "%~1"=="" (
    echo Usage: %~nx0 year
    goto :EOF
)

>NUL 2>NUL powershell "get-date -date '%~1.2.29'" && (
    echo Leap year!
) || (
    echo Not leap year.
)

goto :EOF

您可以对JScript混合使用相同的操作。这是一个更多的代码,但速度要快得多。

@if (@CodeSection == @Batch) @then
@echo off
setlocal

if "%~1"=="" (
    echo Usage: %~nx0 year
    goto :EOF
)

cscript /nologo /e:Jscript "%~f0" "%~1" && (
    echo Leap year!
) || (
    echo Not leap year.
)

goto :EOF
@end
WSH.Quit(new Date(WSH.Arguments(0), 1, 29).getDate() - 29);