如何在 Batch 檔取得系統的日期、時間欄位 (第三版)

  分享到噗浪!

從 Batch 取得日期時間還真囉唆,每次都要查資料 Copy / Paste 才能寫出計算日期時間的指令碼,最近有有需求要抓到「上一個月」的年份與月份,所以有用到數值運算的指令 ( SET /A ),所以乘機再整理一遍取得日期、時間欄位的程式碼。

取得今天日期 ( 其中 P0 代表「不滿 10 自動補零」的意思 )

REM 取得今天的年、月、日 (自動補零)
SET TodayYear=%date:~0,4%
SET TodayMonthP0=%date:~5,2%
SET TodayDayP0=%date:~8,2%

REM 取得今天的年、月、日 (純數字)
REM 2010/08/03 更新:以下是為了修正 Batch 遇到 08, 09 會視為八進位的問題
IF %TodayMonthP0:~0,1% == 0 (
	SET /A TodayMonth=%TodayMonthP0:~1,1%+0
) ELSE (
	SET /A TodayMonth=TodayMonthP0+0
)

IF %TodayMonthP0:~0,1% == 0 (
	SET /A TodayDay=%TodayDayP0:~1,1%+0
) ELSE (
	SET /A TodayDay=TodayDayP0+0
)

echo 日期 %TodayYear%/%TodayMonth%/%TodayDay%
echo 日期 %TodayYear%/%TodayMonthP0%/%TodayDayP0%

取得上個月的年、月 ( 其中 P0 代表「不滿 10 自動補零」的意思 )

REM 取得上個月的年、月
SET /A LastMonthYear=%TodayYear%+0
SET /A LastMonthMonth=%TodayMonth%-1
SET /A LastMonthMonthP0=%LastMonthMonth%
REM 修正年份與月份的數值
IF %LastMonthMonth% EQU 0 (SET /A LastMonthYear=%thisYear%-1)
IF %LastMonthMonth% EQU 0 (SET LastMonthMonth=12)
IF %LastMonthMonth% LSS 10 (SET LastMonthMonthP0=0%LastMonthMonth%)

echo 日期 %LastMonthYear%/%LastMonthMonth%
echo 日期 %LastMonthYear%/%LastMonthMonthP0%

取得當下時間 ( 時、分、秒、豪秒 )

REM 取得時、分、秒 、豪秒
SET Hour=%NowTime:~0,2%
SET Minute=%NowTime:~3,2%
SET Second=%NowTime:~6,2%
SET /A Millisecond=%NowTime:~9,2%*10

echo 時間 %Hour%:%Minute%:%Second%.%Millisecond%

上述關於取得「上個月」的年、月的重點就在於 Batch 可以提供基本的數學運算。另外對於 %time% 的精準度只有到「百分之一秒」,為了改以表達「豪秒」表達所以我將取得的數字乘以 10 處理。

執行 HELP SET 指令後關於 /A 選項(switch)的說明如下:

/A 指定在等號右方的字串是一個要被運算的數字運算式。您可以用運算式進行簡單的運算,而且支援下列
的運算子 (依照運算優先順序由高到低排列):

() - 組成一群
! ~ - - 一元運算符
* / % - 數字運算元
+ - - 數字運算元
<< >> - 邏輯位移
& - 位元運算 and
^ - 位元運算 exclusive or
| - 位元運算 or
= *= /= %= += –= - 指定
&= ^= |= <<= >>=
, - 運算式分隔字元

如果您使用了任何邏輯或餘數運算子,您必須將運算式兩邊括上引號。任何在運算式中非數字的字串會
被當作環境變數,並且在使用前會先將這些環境變數轉換為數字。如果您所指定的環境變數名稱尚未在
目前環境中定義,那麼它的值會被設為 0。這可以讓您用環境變數值來做運算,而不必打入所有的 %
符號來取得它的值。如果 SET /A 是用指令檔之外的命令列執行,它會顯示運算式最後的數值。指定運
算子需要有個環境變數在等號的左方。0x 字首在數字前方代表十六進位數字、0b 字首代表二進位數字
或 0 字首代表八進位數字,否則數字值都是指十進位數字。所以 0x12 就和 18、022 等相同。請注意
八進位數字可能容易弄錯: 像 08 和 09 就不是正確的數字,因為 8 和 9 並不是八進位的正確數字。

相關連結

此文章由 will 發表於 2009/11/3 下午 12:19:00

永久連結 | 評論 (7) | 此文章的RSSRSS comment feed |

分類: 系統管理

標籤: , ,

評論

十一月 3. 2009 13:16

Ryan

再來個第四版本吧:
前置作業:
先使用echo %date%命令了解日期格式
例如我目前用的這台是:
2009/11/03 星期二

那麼,取年份(YYYY)可以下:
echo %date:~0,4%
會取得"2009"

取年份(yy)可以下:
echo %date:~2,2%
會取得"09"

取月份可以下:
echo %date:~5,2%
會取得"11"

取日期可以下:
echo %date:~8,2%
或是echo %date:~-6,2%
會取得"03"

time也一樣可以這樣用

這種方法其實是擷取字串中的某一小段的意思,從第幾個位置(第一個字編號為零)擷取幾個字元

所以當我下指令:
echo %date:~0,4%%date:~5,2%%date:~8,2%
或是
echo %date:~0,4%%date:~5,2%%date:~-6,2%

將會得到:
20091103

Ryan Taiwan

十一月 3. 2009 21:50

Will 保哥

Ryan:

是我昏頭了,竟然發一篇「舊版」的日期時間計算的文章,我本篇文章重新改寫過了,這才是我滿意的第三版。

感謝您的分享! ^_^

Will 保哥 Taiwan

十一月 11. 2009 17:32

I'm ant only

還有依賴date /t及%time%來取得日期/時間的batch script
http://ss64.com/nt/syntax-getdate.html
http://ss64.com/nt/syntax-gettime.html
或者用vbscript解決
http://ss64.com/nt/syntax-getdatetime.html

I'm ant only Hong Kong S.A.R.

八月 3. 2010 14:29

EarlyCAT

請問, 第一段的 SET /A TodayMonth=TodayMonthP0+0 中
如果像這個月是 8 月, 08 會被視為 8 進位, 而 8 進位又沒有這個數字,
要如何解決運算式的衝突呢? 這行會被警告為"不正確數字".

EarlyCAT Taiwan

八月 3. 2010 18:54

Will 保哥

EarlyCAT: 感謝告知! 我後來修改成如下:

REM 取得今天的年、月、日 (自動補零)
SET TodayYear=%date:~0,4%
SET TodayMonthP0=%date:~5,2%
SET TodayDayP0=%date:~8,2%

REM 取得今天的年、月、日 (純數字)
IF %TodayMonthP0:~0,1% == 0 (
  SET /A TodayMonth=%TodayMonthP0:~1,1%+0
) ELSE (
  SET /A TodayMonth=TodayMonthP0+0
)

IF %TodayMonthP0:~0,1% == 0 (
  SET /A TodayDay=%TodayDayP0:~1,1%+0
) ELSE (
  SET /A TodayDay=TodayDayP0+0
)

echo 日期 %TodayYear%/%TodayMonth%/%TodayDay%
echo 日期 %TodayYear%/%TodayMonthP0%/%TodayDayP0%

Will 保哥 Taiwan

七月 15. 2011 14:16

rex

可否請問一下保哥,我在windows的環境想透過批次檔和遠端linux的git server連線,在win可用git bash(例如執行git clone 網址),但如何寫成批次檔呢?謝謝保哥

rex Taiwan

七月 15. 2011 17:39

Will 保哥

rex: 如果是 git bash 的話,應該就要寫 Shell Script 了吧! Smile

Will 保哥 Taiwan

新增評論


( 您輸入的Email不會顯示於網站上 )

  Country flag

biuquote
  • 評論
  • 線上預覽
Loading