如果你想要知道100天以後是星期幾,請問你會怎麼做? 拿計算機按? 翻100頁的日曆? 還是查日曆軟體? 其實,這些的方法都可以讓你找到答案,不過更好的方法是寫一行Tcl的程式。使用程式來計算日期及時間,你就不用擔心大小月、跨月及跨年的問題,這是一種快速又準確的方法,雖然你也可以問別人來取得答案...但應該不會比執行一行Tcl的命令來的快才對。另外,如果你想要寫計帳、行事曆一類的軟體,如果不會計算日期時間的話,似乎是行不通的。這一個章節簡單的介紹Tcl處理日期及時間的方法。
13.1 取得目前的時間
Tcl可以用許多方法取得目前的時間,現在讓我們先來看比較簡單的一種:clock seconds
clock seconds會以整數的法式回傳由1970年到目前為止經過的秒數。例如:
程式輸出:
1239882031
如果你要輸出比較適合人看的格式可以用下面的方法:
程式輸出:
2009-04-16 19:46:47
clock format是用來格式化時間輸出的命令,它可以幫你把clock seconds取得的時間轉換成各種格式輸出。後面的章節會比較詳細的介紹clock format,目前請先不要在意它。想想看,如果你要知道10000秒後是幾年幾月幾日該怎麼做? 其實很簡單:
注意程式的第1行,只要直接把目前得到的時間加上10000秒,就可以計算出來了。程式的輸出如下,原來只是幾個小時後而已。
2009-04-16 22:40:17
又如果你想要知道27天後的日期,該怎麼做?
請看第1行的一堆乘法的那邊,它是在計算27天的總秒數:一天24小時,1小時60分,1分60秒。所以程式的輸出是:
2009-05-13 20:01:56
除了clock seconds可以取得目前的時間之外,你還可以使用下面的方法:
clock milliseconds
clock milliseconds會以整數的法式回傳由1970年到目前為止經過的毫秒數。
clock microseconds
clock microseconds會以整數的法式回傳由1970年到目前為止經過的微秒數。 這兩個命令提供了更精準的時間資訊,但它們並不適合拿來給clock format使用,一般的情形下,我只會在程式需要計時功能的時候才會用到它們。
程式範例:
請比較它們的輸出:
1239883841 1239883841907 1239883841907456
13.2 格式化時間輸出
上面的內容我們已經有看到clock format是用來格式化時間的命令,只要給予一個整數的值,它會把這個值當成是1970年初到現在的時間偏移量,然後輸出你指定的日期時間格式,以下是clock format的語法:clock format timeVal ?-option value...?
timeVal是由1970年第1秒算起的時間。clock format可以接的選項如下:
-format format | format是格式化字串,預設值是:%a %b %d %H:%M:%S %z %Y 。 |
-gmt boolean | 如果boolean指定為true表示要把timeVal當成是UTC時間處理,若是false的話就當成是本地時間來處理。它的預設值是false。 |
-locale localeName | localeName可以用來指定本地化的文字輸出。例如:指定zh_tw輸出的時候會用中文的「星期五」代替英文的「Fri」。 |
-timezone zoneName | zoneName用來指定timeVal的值屬於哪個時區,例如:「:America/New_York」。 |
clock format命令最重要的地方應該是如何寫出正確的「格式化字串」,所謂的格式化字串指的就是「一般字元加上格式化字元」,例如:
"現在的時間是%Y年%m月%d日"
上面「%」符號後面的英文字母,就是格式化字元,而不屬於格式化字元的就都是一般的字元。每個格式化字元都有特別的意思,它們會用來表示真正的年、月、日、時、分、秒或星期...等。clock format命令在執行時,會解析格式化字串,然後把格式化字元都換成真正的值,而一般字元則照實輸出。例如:
程式的輸出是:
現在的時間是2009年04月17日
從上面的例子可以看到格式化字元都被換成真正的數值了。以下我們介紹幾個常用的格式化字元。
%a | 以縮寫表示星期幾。例如:Mon、Tues...。 |
%A | 以完整的方式表示星期幾。例如:Monday、Tuesday...。 |
%b | 以縮寫表示月份。例如:Jan、Feb |
%B | 以完整的方式表示月份。例如:January、February |
%d | 以兩位數表示一個月中的第幾日(01~31)。 |
%e | 以一位數表示一個月中的第幾日(1~31)。如果是一位數,前面會補一個空白。 |
%H | 以兩位數表示一個天中的第幾小時(00~23),24小時制。 |
%I | 以兩位數表示一個天中的第幾小時(12~11),12小時制。 |
%j | 以三位數表示一年中的第幾日(001~366),12小時制。 |
%k | 以一位數表示一個天中的第幾小時(0~23),24小時制。如果是一位數,前面會補一個空白。 |
%l | 以一位數表示一個天中的第幾小時(12~11),12小時制。如果是一位數,前面會補一個空白。 |
%m | 以兩位數表示月份(01~12)。 |
%M | 以兩位數表示小時裡的幾分(00~59)。 |
%N | 以一位數表示月份(1~12)。如果是一位數,前面會補一個空白。 |
%p | 表示為AM或PM。 |
%P | 表示為am或pm。 |
%S | 以兩位數表示分裡的秒(00~59)。 |
%u | 以數值表示一周裡的星期幾(1→星期一, 7→星期日)。 |
%U | 以兩位數表示一年裡的第幾週(00-53),用星期日表示為一週的第一天。 |
%u | 以數值表示一周裡的星期幾(0→星期日, 6→星期六)。 |
%U | 以兩位數表示一年裡的第幾週(00-53),用星期一表示為一週的第一天。 |
%y | 以二位數表示年份。例如:77、09...。 |
%Y | 以四位數表示年份。例如:1977、2009...。 |
%z | (+hhmm)或(-hhmm)的方式表示時區。例如:+0800。 |
%z | 以名字表示時區。例如:CST。 |
%% | 表示為一個「%」字元。 |
範例一:
程式輸出:
哈囉!! 現在是2009年04月17日 下午 04點30分36秒 星期五
範例二:
程式輸出:
2009-04-17 16:33:40
13.3 解析時間字串
上面介紹的clock format可以說是「秒數」轉換「時間字串」的功能,那解析時間串字剛就是反向的操作。想想看:現在有一個字串「2009-04-17」你想要把它轉回秒數然後做一些計算,該怎麼做? 其實這時候就是使用解析時間字串的好時機。Tcl使用clock scan命令來解析帶有時間資訊的字串,它的語法如下:clock scan inputString ?-option value...?
inputString是帶有時間資訊的字串,這個命令可以使用的選項和clock format是一樣的,但多了一個選項:
-base time | 如果沒有指定-format時,inputString可以使用一種相對時間的方式來解析時間。例如:「1 days」表示要掃出基準時間加上一天的時間值,而基準時間就由這個選項決定,它的預設值是現在的時間。 |
clock scan同樣可以使用clock format大部份的格式化字元,我們用例子來看看它的用法:
假設你現在有一個「2009年12月25日」字串,你想要把它轉回時間值:
它的輸出是:
1261670400
這個例子會回傳2009年12月25日0時0分0秒的時間值。注意!! 這裡最重要的事就是要如何寫出-format後面的字串,其實這項工作不會太困難,你可用下面的兩個步驟輕鬆的完成:
- 先複製inputString字串到-format後面。像這樣「-format "2009年12月25日"」
- 然後你知道2009是4位數的年所以用「%Y」,12是2位數的月用「%m」,25是2位數的日用「%d」。然後就變成「-format "%Y年%m月%d日"」。
ok!讓我們再試一個例子,現在我有一個字串「2009/11/15 13:34:01」,要怎麼把它轉回時間值?
它的輸出是:
1258263241
13.4 計算時間
在之前的例子裡,我們知道使用加減時間值可以正確的計算時間,其實除了這個方式之外,Tcl還提供了更方便的方法讓你來計算時間,它就是clock add命令,請看它的語法:clock add timeVal ?count unit...? ?-option value?
timeVal是時間的基準值,簡單的說就是被加數,count加數,而unit是count的單位。可以用的單位有: seconds、minutes、hours、days、weeks、months及years。可以使用的選項是clock format裡的-gmt、-locale及-timezone,它們的意義是一樣的。
例如,想知道現在開始3天又4秒後的時間值,可以這麼做:
想知道現在15天前現在的時間值,可以這麼做:
想知道3年又4天又4小時後的時間值,可以這麼做:
最後一點!! 上面這些計算時間所回傳的值,你都可以用clock format轉換為比較適合人閱讀的格式。所以你會用一行程式算出100天後是星期幾了嗎?
真的只要一行~~~沒說大話吧!!
按右上方的「#」號切換側邊欄