【💊 Python的解憂錦囊】Milliseconds To hh:mm:ss(毫秒轉成小時、分鐘和秒)

2023/09/06閱讀時間約 5 分鐘
圖片來源

圖片來源

您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。

有時候我們在處理字幕檔或者是音訊時, 常常會計算時間這個單位, 例如: 這個字幕檔的長度多少毫秒(milliseconds)、這段音檔多少毫秒(milliseconds), 當然也有可能是「秒(seconds)」, 但最終呈現給使用者的部份通常會是格式化過後的顯示方式, 例如: 小時:分鐘:秒 這是一種比較常見的格式化轉換的結果, 那在Python世界我們可以怎麼做呢? 在這邊我們會帶給您最簡易的轉換方式, 尤其是可以復用的API為最高原則, 避免自行重複實作增加BUG的風險, 為什麼減少BUG很重要? 請參閱「【🔒 Python 先修班】用心 🛡️ 守護我們辛苦打造的程式(Unit Test單元測試防護指南)」。

介紹一下今天的主角: timedelta

圖片來源

圖片來源

timedelta是Python中內建的datatime子類別, 它擅長處理日期與時間上的各種運算, 這裡就來簡介一下基本的一些常見用法:

from datetime import timedelta, datetime

# 💻 timedelta(時間單位)
thirty_minutes = timedelta(minutes=30)
# 0:30:00

# 現在時間
now = datetime.now()

after_thirty_minutes = now + thirty_minutes
# 30分鐘後的時間
# 2023-08-28 16:02:06.757500

簡單來說, timedelta可以進行時間的加減、轉換, 讓我們在處理時間時更加標準與簡易。

今日重點: 如何轉換(Milliseconds To hh:mm:ss)

使用餘數技巧「divmod(a, b)」

圖片來源

圖片來源

# 13除以2 = 61
# => 6, 1 = divmod(13, 2)
quotient, remainder = divmod(13, 2)

有了餘數技巧之後, 我們就可以依序轉換從「毫秒/秒」 → 「小時」 → 「分鐘」。

善用timedelta裡面的total_seconds()

圖片來源

圖片來源

正好在timedelta裡有total_seconds()這個API可以幫我們將時間單位統一換算成總秒數, 那呼應上述的餘數技巧我們就可以進行逐步換算, 如果不懂也沒關係, 底下我們實際轉換一次給您看。

讓我們動動手撰寫一套方法來轉換一下

圖片來源

圖片來源

我們底下的程式碼稍做修改,因為不足一秒的部分也盡量顯示出來,才不會有一些四捨五入的誤差問題, 因此我們會以hh:mm:ss.fff為實作範例如下:

from datetime import timedelta

def milliseconds_to_hmsf(milliseconds: int) -> str:
"""毫秒轉hh:mm:ss.ffff
"""
time_delta = timedelta(milliseconds=milliseconds)
total_seconds = time_delta.total_seconds()

# 1小時3600
seconds_in_hours = timedelta(hours=1).total_seconds()

# 1分鐘60
seconds_in_minute = timedelta(minutes=1).total_seconds()

# 小時, 剩餘小時的秒數 = 總秒數/3600(1小時=3600)
hours, remainder = divmod(total_seconds, seconds_in_hours)

# 分鐘, 剩餘秒數 = 剩餘小時的秒數/60(1分鐘=60)
minutes, seconds = divmod(remainder, seconds_in_minute)

# 秒, 毫秒 = 剩餘秒數的整數部分和毫秒部分
seconds_int = int(seconds)
milliseconds = int((seconds - seconds_int) * 1000)


return f'{int(hours):02}:{int(minutes):02}:{seconds_int:02}.{milliseconds:03}'

print(milliseconds_to_hms(6000))

結語

處理時間也是常常會使用到的環節, 像是統計區間資料、計算音檔長度、日期選擇、日期轉換…,都與時間離不開關係, 因此我們可以善用datetime與timedelta來處理這些部份, 會比我們自行實作來的更可靠、更快速。

喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 - 為什麼要加入?

歡迎加入一起練習寫作,賺取知識,累積財富!

91會員
260內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!