当前位置: 移动技术网 > IT编程>网络>Dos/Bat > 5个计算天数的批处理代码第1/3页

5个计算天数的批处理代码第1/3页

2017年12月12日  | 移动技术网IT编程  | 我要评论
于是把我的收集整理后发出来给大家共享一下。 说明:    收集整理: 随风 @bbs.bathome.cn &n

代码三
复制代码 代码如下:

@echo off
:: 作者: namejm   荣誉版主 出自:cn-dos
:: 求n天前的日期
:: 思路:
::   把当前日期转换为天数
::   用当前天数减去n天
::   把结果再转换为日期
:: 具体操作是:
::   逐年计算天数
:: 特点:
::    代码简洁,容易理解,速度较慢,但是不受指定天数大小的影响
setlocal enabledelayedexpansion
:main
cls
:: 日期可以带星期,但是,必须以年月日的顺序排列
:: 年份必须是四位,否则会出错
set day=%date%
set days=0
echo.&echo.
echo       指定的日期是:%day%
echo.
set /p input=      请指定要追溯的天数:
rem ========把指定日期转换为天数========
:: 提取日期
for /f "tokens=1-3 delims=-/. " %%i in ("%day%") do (
    set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100
)
:: 把年份转化为天数
for /l %%i in (1,1,%sy%) do (
    set /a leap="^!(%%i %% 4) & ^!(^!(%%i %% 100)) | ^!(%%i %% 400)"
    set /a days=days+365+leap
)
:: 把月份转化为天数
set /a num=0, mday=0, max=28+leap
set str=0 31 %max% 31 30 31 30 31 31 30 31 30
for %%i in (%str%) do (
    set /a num+=1
    if !num! leq !sm! set /a mday+=%%i
)
set /a days=days+mday+sd
set /a days-=input

rem ========把天数转换为日期========
:: 获取年份
for /l %%i in (1,1,%sy%) do (
    set /a leap="^!(%%i %% 4) & ^!(^!(%%i %% 100)) | ^!(%%i %% 400)"
    set /a days_tmp=365+leap
    if !days! gtr !days_tmp! (
        set /a days-=days_tmp
        set y=%%i
    )
)
:: 获取月份及日期
set /a m=1, max=28+%leap%
set str=31 %max% 31 30 31 30 31 31 30 31 30
for %%i in (%str%) do (
    if !days! gtr %%i (
        set /a days-=%%i
        set /a m+=1
    ) else goto next
)
:next
set m=0%m%
set d=0%days%
cls
echo.&echo.
echo       指定的日期是:%day%
echo.
echo       %input% 天前的日期是:%y%-%m:~-2%-%d:~-2%
pause>nul
goto main


代码四、
复制代码 代码如下:

@echo off
:: 作者: namejm   荣誉版主 出自:cn-dos
:: 求n天前的日期
:: 思路:
::   把当前日期转换为天数
::   用当前天数减去n天
::   把结果再转换为日期
:: 具体操作是:
:    先按照每年365天计算,然后再计算闰年的个数
::   最后再做转换
:: 特点:
::   代码复杂,不便于理解,但是速度很快
:: 计算上还存在bug,可以用 11111 来和头两个做对比测试,暂时没时间更新
setlocal enabledelayedexpansion
:main
cls
:: 日期可以带星期,但是,必须以年月日的顺序排列
:: 年份必须是四位,否则会出错
set day=2007-01-02
set /a days=0, sum=0
echo.&echo.
echo       指定的日期是:%day%
echo.
set /p input=      请指定要追溯的天数:
rem =======把日期转换为天数=======
:: 提取日期
for /f "tokens=1-3 delims=/-. " %%i in ("%day%") do (
    set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100, y=%%i
)
:: 把年份抓换为天数
set num=0
if %sy% lss 400 goto next1
call :leap_num
:next1
set /a leap_num=sy/4-num
:: 把月份转换为天数
set /a leap="^!(sy %% 4) & ^!(^!(sy %% 100)) | ^!(sy %% 400)"
set /a max=28+leap
set num=0
set str=31 %max% 31 30 31 30 31 31 30 31 30 31
for %%i in (%str%) do (
    set /a num+=1
    if !num! lss %sm% set /a sum+=%%i
)
set /a days=365*sy+leap_num+sum+sd
set /a days-=input
rem =======把天数转换为日期=======
:: 获取年份
set /a y=days/365
set /a mod1=days %% 365
call :leap_num
set /a mod2=mod1-leap_num
:loop2
if %mod2% lss 0 (
    set /a y-=1
    set /a mod2=365+mod2
) else goto next2
goto loop2
:: 获取月份及日期
:next2
set /a m=1, days=mod2+1, max=28+%leap%
set str=31 %max% 31 30 31 30 31 31 30 31 30
for %%i in (%str%) do (
    if !days! gtr %%i (
        set /a days-=%%i
        set /a m+=1
    ) else goto next3
)
:next3
set m=0%m%
set d=0%days%
cls
echo.&echo.
echo       指定的日期是:%day%
echo.
echo       %input% 天前的日期是:%y%-%m:~-2%-%d:~-2%
pause>nul
goto main
:leap_num
:: 计算能被100整除但是不能被400整除的年次
set /a y_tmp=(%y:~0,1%%y%-%y%)/10
set num=0
:loop1
set /a mod=y_tmp %% 400
if %mod% neq 0 set /a num+=1
set /a y_tmp-=100
if %y_tmp% geq 100 goto loop1
set /a leap_num=y/4-num
goto :eof

代码五、
  用 vbs 代码可以更简单。但是需创建 tmptmp.vbs 临时文件。
复制代码 代码如下:

@echo off
set /p _tian=      请指定要追溯的天数:
>tmptmp.vbs echo wscript.echo dateadd("d",-%_tian%,date)
for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo tmptmp.vbs') do (
     set /a y=%%i,m=100%%j%%100,d=100%%k%%100
)
set "difdate=%y%-%m%-%d%"
del/q tmptmp.vbs
cls&echo.&echo.
echo       指定的日期是:  %date:~0,10%
echo.
echo       %_tian% 天前的日期是:%difdate%
echo.&pause&exit

2

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网