打卡紀錄是 09:15,下班是 18:40,我想知道今天上了幾個小時的班。這時候會用到 TIME、HOUR、MINUTE、SECOND 和 TIMEVALUE 這一組時間函式。
NOW 在 日期與時間入門 介紹過了,這邊不重講。簡單說,NOW() 的整數部分是今天,小數部分就是現在的時間。坦白說,這組函式我自己最常用的是 HOUR 跟 TIMEVALUE,SECOND 幾乎沒用過,不過整理成工具書放著,需要的時候回來查。
怎麼選
| 要做的事 | 用哪個 | 回傳 |
|---|---|---|
| 用時、分、秒三個數字組出時間 | TIME | 0 到 1 之間的小數 |
| 取出時間的小時 | HOUR | 0 到 23 |
| 取出時間的分鐘 | MINUTE | 0 到 59 |
| 取出時間的秒 | SECOND | 0 到 59 |
| 把「14:35:48」這種文字變成時間 | TIMEVALUE | 0 到 1 之間的小數 |
時間是一天的分數
日期是整數,時間是小數,代表一天走了多少比例。中午 12:00 是 0.5,早上 6:00 是 0.25。這個換算後面每個函式都會用到,先放一張表:
| 時間 | 一天的分數 | 算法 |
|---|---|---|
| 1 小時 | 0.0416667 | 1 / 24 |
| 1 分鐘 | 0.000694444 | 1 / 1440 |
| 1 秒 | 0.0000115741 | 1 / 86400 |
| 9:30 | 0.395833 | 9.5 / 24 |
| 14:35:48 | 0.608194 | 52548 / 86400 |
14:35:48 是 14 × 3600 + 35 × 60 + 48 = 52548 秒,再除以一天的 86400 秒,就是 0.608194。
組時間
TIME
TIME 用時、分、秒三個數字組出一個時間。
語法:
- 時:小時。
- 分:分鐘。
- 秒:秒。
三個參數都要填,沒有選填。
組出 9:30:00
=TIME(9, 30, 0)先手算:9.5 小時除以 24,等於 0.395833。儲存格會自動套上時間格式,所以你看到的是 9:30 這樣的時間,把格式改成「格式」>「數值」>「數字」才會看到 0.395833。
跟 DATE 一樣,分、秒超過 59 時會自動進位:
75 分鐘進位成 1 小時 15 分
=TIME(8, 75, 0)結果是 9:15,也就是 0.385417。我個人滿喜歡拿這個特性算「幾點幾分之後再加 N 分鐘」,直接把分鐘加大就好。
小時超過 23 的話,會從 0 重新算起,所以 得到的是 1:00,不會多出一天。要加天數,直接用日期加。
HOUR
HOUR 取出時間的小時,結果是 0 到 23 的整數。
語法:
- 時間:時間,或是帶日期的日期時間,日期的部分會被忽略。
取出小時
=HOUR(TIME(14, 35, 48))結果是 14。HOUR 是 24 小時制,不會回傳 1 到 12 加上午下午。想分上午下午,自己判斷:
12 點以前算上午
=IF(HOUR(A2) < 12, "上午", "下午")A2 是 14:35:48 的話,結果是「下午」。
也可以直接用在日期時間上。日期加時間,就是日期時間,在 A2 輸入:
把日期和時間相加,得到日期時間
=DATE(2026, 10, 11) + TIME(14, 35, 48)A2 的值是 46306.608194, 照樣得到 14。
MINUTE
MINUTE 取出時間的分鐘,結果是 0 到 59。
語法:
- 時間:時間或日期時間。
取出分鐘
=MINUTE(TIME(14, 35, 48))結果是 35。
MINUTE 只回傳分鐘欄位,14:35 得到 35,不含前面的 14 小時與秒。14:35:48 換成當日累計分鐘是 14 × 60 + 35 + 48/60 = 875.8;HOUR(A2)*60+MINUTE(A2) 會少掉 0.8 分鐘。
若 A2 只有時間值,可乘 1440;若沿用上一節含日期的 A2,要先取一天的小數部分,不能把整個日期序號乘 1440:
含日期時只取當日時間,再換成分鐘
=MOD(A2, 1)*1440TIME(14,35,48)*1440 與 MOD(DATE(2026,10,11)+TIME(14,35,48),1)*1440 的結果都是 875.8。這是當日的時間,不是跨日經過時數。
SECOND
SECOND 取出時間的秒,結果是 0 到 59。
語法:
- 時間:時間或日期時間。
取出秒
=SECOND(TIME(14, 35, 48))結果是 48。
文字轉時間
TIMEVALUE
TIMEVALUE 把「看起來像時間」的文字轉成一天的分數,跟日期那邊的 DATEVALUE 是同一類的函式。
語法:
- 時間字串:試算表看得懂的時間格式,例如
"14:35:48"或"14:30",用雙引號包起來,或參照一個文字儲存格。
文字 14:35:48 轉成一天的分數
=TIMEVALUE("14:35:48")先手算:52548 / 86400 = 0.608194,你應該會得到 0.608194!
從系統匯出來的打卡時間常常是文字,靠左對齊,不能直接相減。轉成分數之後就能算了,例如把 "1:30" 換成分鐘:
1 小時 30 分等於幾分鐘
=TIMEVALUE("1:30") * 1440結果是 90。這邊要記得一天有 1440 分鐘,乘 24 的話是換成小時。
打卡紀錄算工時
我手上有三天的打卡紀錄,第三筆是夜班,下班時間比上班時間「小」:
| A | B | C | |
|---|---|---|---|
| 1 | 上班 | 下班 | 工時(小時) |
| 2 | 8:52 | 17:48 | |
| 3 | 9:15 | 18:40 | |
| 4 | 22:00 | 6:00 |
下班減上班,就是這天工作了一天的幾分之幾。前兩列直接減:
工時換成小時,取到小數 2 位
=ROUND((B2 - A2) * 24, 2)先把結果欄設為「格式」>「數值」>「數字」,別沿用打卡欄的時間格式。前兩筆的數值是 C2 8.93(8 小時 56 分)、C3 9.42(9 小時 25 分)。
第三列如果也這樣寫,6:00 減 22:00 是 -16 小時,因為試算表不知道下班是隔天。跨午夜的處理是用 MOD 對 1 取餘數,把負數補回一整天:
跨午夜也能算的工時
=ROUND(MOD(B2 - A2, 1) * 24, 2)C4 是 8,C2、C3 結果不變。這個版本只適合「僅有時刻、已知單次班別少於 24 小時」的情況;下班小於上班會被解讀成隔天,不能拿它偵測漏打卡或順序填錯。
若每筆有完整日期時間,就直接用結束減開始,再乘 24。2026/10/11 00:00 到隔天 00:00 是 24 小時、到隔天 02:00 是 26 小時;但 24 小時的差再套 MOD(...,1) 會變成 0。跨日、24 小時以上與漏打卡資料,應先補齊日期並驗證前後順序,不要一律取餘數。
同一天 2026/10/11 的反序輸入也一樣:開始 18:00、結束 09:00,直接相減是 −9 小時,套 MOD 卻變成正的 15 小時。既然已填日期,這個負值應先當成順序或資料問題核對,不要用 MOD 把它包成看似正常的班別。
想要「8 小時 56 分」這種拆開來的寫法,就用 HOUR 和 MINUTE 去拆差值:
工時拆成小時和分鐘
=HOUR(MOD(B2 - A2, 1)) & " 小時 " & MINUTE(MOD(B2 - A2, 1)) & " 分"C2 得到「8 小時 56 分」,C3 是「9 小時 25 分」。
加總超過 24 小時
三天的工時加起來是 8:56 + 9:25 + 8:00 = 26:21。直接 SUM 之後,時間格式只顯示 24 小時以內的部分,26:21 會顯示成 2:21。要看總時數有兩個做法:
- 乘 24 變成小時的數字:,結果是 26.35。
- 用
TEXT加上方括號格式:,結果是26:21。
方括號的 [h] 代表「累計小時,不要超過 24 就歸零」。用儲存格格式的話,是「格式」>「數值」>「自訂數字格式」,輸入 [h]:mm。
這兩個算式用 SUMPRODUCT 讓 MOD 一次處理整個範圍。如果覺得難讀,也可以在 C 欄先算好每一天的工時再加總。
請假如果橫跨多天,還要排除午休、週末與假日,可以接著看 跨日請假時數計算,用每天上下午班段與請假區間的重疊時間來算。
下次拿到匯出的打卡檔,先用 TIMEVALUE 確認是不是文字,再套工時算式看看吧!
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章日期與時間入門:日期序號、DATE、TODAY 與文字日期
從日期序號開始,認識 DATE、TODAY、NOW、YEAR、MONTH、DAY,學會日期加減、分辨文字日期和真日期,並搞清楚顯示格式和儲存格的值是兩回事。
星期幾與第幾週:WEEKDAY、WEEKNUM、ISOWEEKNUM 的 type 怎麼選
整理 WEEKDAY 的 10 種 type、WEEKNUM 的週起始日與 21(ISO),以及 ISOWEEKNUM 在跨年那幾天的行為。附對照表、週末判斷、這個月第幾週,以及 ISO 年週代碼的寫法。
年資、工作日、到期日:日期計算實戰
用 DATEDIF 算員工年資,用 NETWORKDAYS 和 WORKDAY 搭配假日清單算工作日,再用 EDATE 和 EOMONTH 算合約到期日與月底結帳日。
留言討論
共 0 則留言
