5個(gè)計(jì)算天數(shù)的批處理代碼第2/3頁
更新時(shí)間:2008年06月26日 22:44:36 作者:
發(fā)現(xiàn)很多人需要計(jì)算 n 天前后的天數(shù),
但是計(jì)算天數(shù)要考慮到大月小月,平年閏年。及其麻煩。
代碼三
復(fù)制代碼 代碼如下:
@echo off
:: 作者: namejm 榮譽(yù)版主 出自:cn-dos
:: 求N天前的日期
:: 思路:
:: 把當(dāng)前日期轉(zhuǎn)換為天數(shù)
:: 用當(dāng)前天數(shù)減去N天
:: 把結(jié)果再轉(zhuǎn)換為日期
:: 具體操作是:
:: 逐年計(jì)算天數(shù)
:: 特點(diǎn):
:: 代碼簡潔,容易理解,速度較慢,但是不受指定天數(shù)大小的影響
setlocal enabledelayedexpansion
:Main
cls
:: 日期可以帶星期,但是,必須以年月日的順序排列
:: 年份必須是四位,否則會(huì)出錯(cuò)
set day=%date%
set days=0
echo.&echo.
echo 指定的日期是:%day%
echo.
set /p input= 請(qǐng)指定要追溯的天數(shù):
rem ========把指定日期轉(zhuǎn)換為天數(shù)========
:: 提取日期
for /f "tokens=1-3 delims=-/. " %%i in ("%day%") do (
set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100
)
:: 把年份轉(zhuǎn)化為天數(shù)
for /l %%i in (1,1,%sy%) do (
set /a leap="^!(%%i %% 4) & ^!(^!(%%i %% 100)) | ^!(%%i %% 400)"
set /a days=days+365+leap
)
:: 把月份轉(zhuǎn)化為天數(shù)
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 ========把天數(shù)轉(zhuǎn)換為日期========
:: 獲取年份
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
代碼四、
復(fù)制代碼 代碼如下:
@echo off
:: 作者: namejm 榮譽(yù)版主 出自:cn-dos
:: 求N天前的日期
:: 思路:
:: 把當(dāng)前日期轉(zhuǎn)換為天數(shù)
:: 用當(dāng)前天數(shù)減去N天
:: 把結(jié)果再轉(zhuǎn)換為日期
:: 具體操作是:
: 先按照每年365天計(jì)算,然后再計(jì)算閏年的個(gè)數(shù)
:: 最后再做轉(zhuǎn)換
:: 特點(diǎn):
:: 代碼復(fù)雜,不便于理解,但是速度很快
:: 計(jì)算上還存在bug,可以用 11111 來和頭兩個(gè)做對(duì)比測(cè)試,暫時(shí)沒時(shí)間更新
setlocal enabledelayedexpansion
:Main
cls
:: 日期可以帶星期,但是,必須以年月日的順序排列
:: 年份必須是四位,否則會(huì)出錯(cuò)
set day=2007-01-02
set /a days=0, sum=0
echo.&echo.
echo 指定的日期是:%day%
echo.
set /p input= 請(qǐng)指定要追溯的天數(shù):
rem =======把日期轉(zhuǎn)換為天數(shù)=======
:: 提取日期
for /f "tokens=1-3 delims=/-. " %%i in ("%day%") do (
set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100, y=%%i
)
:: 把年份抓換為天數(shù)
set num=0
if %sy% lss 400 goto next1
call :leap_num
:next1
set /a leap_num=sy/4-num
:: 把月份轉(zhuǎn)換為天數(shù)
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 =======把天數(shù)轉(zhuǎn)換為日期=======
:: 獲取年份
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
:: 計(jì)算能被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 代碼可以更簡單。但是需創(chuàng)建 tmptmp.vbs 臨時(shí)文件。
復(fù)制代碼 代碼如下:
@echo off
set /p _tian= 請(qǐng)指定要追溯的天數(shù):
>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
相關(guān)文章
批處理入門手冊(cè)之批處理常用DOS命令篇(attrib、del、copy、xcopy)
這篇文章主要介紹了批處理入門手冊(cè)之批處理常用DOS命令篇(attrib、del、copy、xcopy),需要的朋友可以參考下2016-11-11Attrib 顯示、設(shè)置或刪除指派給文件或目錄的只讀、存檔、系統(tǒng)以及隱藏屬性
Attrib 顯示、設(shè)置或刪除指派給文件或目錄的只讀、存檔、系統(tǒng)以及隱藏屬性...2007-09-09css js 圖片壓縮批處理命令(基于YUI Compressor)
我的css js 圖片壓縮批處理命令,比較好用的就是基于YUI Compressor的。網(wǎng)上也有很多朋友打包好的,腳本之家提供下載過。2011-01-01一鍵重置mysql的root密碼的實(shí)現(xiàn)腳本
這篇文章主要介紹了一鍵重置mysql的root密碼的實(shí)現(xiàn)腳本,比較實(shí)用,需要的朋友可以參考下2014-09-09