您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。
有時候我們在處理字幕檔或者是音訊時, 常常會計算時間這個單位, 例如: 這個字幕檔的長度多少毫秒(milliseconds)、這段音檔多少毫秒(milliseconds), 當然也有可能是「秒(seconds)」, 但最終呈現給使用者的部份通常會是格式化過後的顯示方式, 例如: 小時:分鐘:秒 這是一種比較常見的格式化轉換的結果, 那在Python世界我們可以怎麼做呢? 在這邊我們會帶給您最簡易的轉換方式, 尤其是可以復用的API為最高原則, 避免自行重複實作增加BUG的風險, 為什麼減少BUG很重要? 請參閱「【🔒 Python 先修班】用心 🛡️ 守護我們辛苦打造的程式(Unit Test單元測試防護指南)」。
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可以進行時間的加減、轉換, 讓我們在處理時間時更加標準與簡易。
# 13除以2 = 6餘1
# => 6, 1 = divmod(13, 2)
quotient, remainder = divmod(13, 2)
有了餘數技巧之後, 我們就可以依序轉換從「毫秒/秒」 → 「小時」 → 「分鐘」。
正好在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時代下為創作者、閱讀者打造的專屬共贏平台 - 為什麼要加入?
歡迎加入一起練習寫作,賺取知識,累積財富!