程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 批處理中的時間計算詳解

批處理中的時間計算詳解

編輯:關於C語言
 

最近總是有人在詢問涉及到時間和日期計算的問題,其實要計算時間和日期最有效的方
法是用vbs的時間函數,幾行代碼就解決了。但我們今天要談的就是如何用批來計算時間和日期
(有點自找苦吃的感覺),下面就展開正題吧:

  一、系統中的date和time變量
  要進行時間和日期的計算,我們必須認識兩個系統變量date和time。當你在cmd中輸入ec
ho %date%#%time%再回車,屏幕上就會出現這樣的一排字符:2009-08-19 星期三#10:20:10.20
,前面是表示的當前的日期-2009年8月19日星期三共14個字符(中間有個空格),後面表示的是當
前的時間10點20分10秒20毫秒共13個字符。當然在不同的系統中時間格式是不一樣的,我們暫以
xp系統為例來繼續後面的分析。轉回正題,現在我們可以通過變量截取命令來獲得想要的時間參
數。如我想要獲得當前的小時和分的值並把它分別賦值給名為h和m的變量:set "h=%time:~,2%
"&set "m=%time:~3,2%",在這裡要注意除了年以外所有的時間參數都是兩位數的格式(年是四
位),當數值不滿兩位時,系統會自動在前面補上0,小時是補上空格如: 8:04:09:03,這就會給我
們的計算帶來麻煩(小時中的空格不影響計算),具體的將會在後面詳細說明。

  二、進制互換和去零操作
  事實上時間參數是很麻煩,其參數格式上存在著數種進制:十進制(年、毫秒)、十二進制(
月)、三十進制(天,姑且這麼說)、七進制(星期)、二四進制(小時)、六十進(分秒)。大家
看是不是很麻煩,因為cmd中只能進行十進制計算,所以我們就必須先將所有的要計算的參數轉化成
十進制計算後再轉回相應的進制。我們前面講到當分、秒(還有月、天)值不滿兩位時,系統會自動在前
面補上0,要想正確計算,我們就必須去掉前面這個0。為什麼?因為在cmd中不會將08 09這樣的數值
認定為是十進制數值,而cmd中一般是只能進行十進制計算的(除了位運算),所以會導致程序出錯。
那麼如何進行進制互換以及去零操作呢?下面我們以例示之並說明:

@echo off&setlocal enabledelayedexpansion
rem 計算當前時間往後1000秒是什麼時間(不包含日期計算)
set "h=%time:~,2%"&set "m=%time:~3,2%"&set "s=%time:~6,2%"
echo 當前時間%h%:%m%:%s%
rem 上面依次截取時間變量的時、分、秒值並分別賦值給h、m、s變量
for /l %%a in (1,1,1000) do (
set /a m=1!m!%%100,s=1!s!%%100,s+=1
rem 上面將m、s變量去零轉化為有效的10進制數值
if !s! equ 60 set /a s=0,m+=1
if !m! equ 60 set /a m=0,h+=1
if !h! equ 24 set /a h=0
rem 上面將每次遞加後的時、分、秒值轉化為相應的進制
)
set "m=0%m%"&set "m=!m:~-2!"
set "s=0%s%"&set "s=!s:~-2!"
rem 上面將分、秒值在前面補0並取後兩位數(補足兩位數)
echo 往後1000秒是%h%:%m%:%s%
pause>nul

這時,可能有人會問到上面的去零究竟是怎麼實現的?其實關於這個我在《批處理實用技
術》一貼中就已經說明了,今天就再講解一次。首先大家要認識set /a 中這個命令符"%%",它表
示取余操作,就是我們數學中所說的取被除數相對於除數的余數。如:set /a a=14%%3,b=27%%3
a b的值分別為2和0,也就是說14/3=4(2)余數是2,27/3=9(0)余數是0。那麼我們現在回到時間
的計算上來,假設當前時間為7:04:08秒,我們就可以在分和秒的值前都加上1,然後對100取余,
余數不就是4和8了嗎?我們還是用代碼來加以說明:

@echo off
set "times= 7:04:08"&rem 在設置變量是不要與系統變量同名,所以加上了s
set /a h=%times:~,2%,m=1%times:~3,2%%%100,s=1%times:~6,2%%%100
echo %h%:%m%:%s%
pause>nul

 三、復雜的時間計算回溯和推移
  這一問題多出現對一定時間范圍內的文件操作上,要確定這一時間范圍就必須進行時間
的計算。首先我們來看一段代碼:

@echo off&setlocal enabledelayedexpansion
rem 計算當前日期時間回溯3286小時的日期和時間
set /a y=%date:~,4%,mo=1%date:~5,2%%%100,d=1%date:~8,2%%%100,h=%time:~,2%,m=1%time:~3,2%%%100,s=1%time:~6,2%%%100
echo 當前時間為:%y%年%mo%月%d%日%h%時%m%分%s%秒
call :judge
for %%a in (1 3 5 7 8 10 12) do set "_%%a=31"
for %%a in (4 6 9 11) do set "_%%a=30"
set /a num_d=3286/24,num_h=3286%%24
for /l %%a in (1,1,%num_d%) do (
set /a d-=1
if !d! equ 0 call :lp
)
for /l %%a in (1,1,%num_h%) do (
set /a h-=1
if !h! equ 0 set /a h=24,d-=1
if !d! equ 0 call :lp
)
echo 回溯3286小時是%y%年%mo%月%d%日%h%時%m%分%s%秒
pause>nul&goto :eof
:lp
set /a mo-=1
if !mo! equ 0 set /a mo=12,y-=1&call :judge
set /a d=_%mo%&goto :eof
:judge
rem 對閏年的判斷並設定2月天數
set /a a=%y%%%4,b=%y%%%100,c=%y%%%400,_2=28
if %b% equ 0 (
if %c% equ 0 set /a _2+=1
) else (
if %a% equ 0 set /a _2+=1
)

現在我們來對這段代碼進行詳解。大家知道,在時間上有一個重要的不定因素:二月的總
天數,當年份為閏年時二月的總天數為29天,否則就是28天。那麼當時間回溯和推移時這個對閏
年的判斷是顯得極為重要,那麼我們怎麼判斷閏年呢?當然是根據閏年的定義來判斷:能被100整
除且能整除400以及不能被100整除但能被4整除的年份都是閏年,反之則是平年。如代碼中的ju
dge子塊就是對計算過程中各到達年份(當月份為12月時)是否為閏年。那麼除了這個二月的總天  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved