Python 提供了 time 和 datetime 模組,方便處理時間和日期相關的操作。time 模組提供 Unix 時間戳記和時間暫停等功能,datetime 模組則提供日期時間物件的建立、運算和格式化。結合 subprocess 模組,可以執行外部程式,例如播放音效檔案作為計時器提醒。利用 timedelta 物件,可以計算時間間隔,例如計算兩個日期之間的差距。strftime() 方法可以將日期時間物件格式化成特定字串格式,而 strptime() 方法則可以將字串解析成日期時間物件。這些功能在開發計時器、時間追蹤程式等應用中非常實用。
時間追蹤程式的設計與實作
時間追蹤是一個非常實用的功能,許多應用程式都需要這個功能。下面是一個簡單的時間追蹤程式的設計與實作。
程式碼
import time
def lap_timer():
start_time = time.time()
lap_number = 1
last_time = start_time
try:
while True:
input("Press Enter to start the next lap...")
current_time = time.time()
lap_time = round(current_time - last_time, 2)
total_time = round(current_time - start_time, 2)
print(f"Lap #{lap_number}: {total_time} ({lap_time})")
lap_number += 1
last_time = current_time
except KeyboardInterrupt:
print("\nDone.")
lap_timer()
程式解釋
這個程式使用 time 模組來追蹤時間。lap_timer 函式是主函式,負責控制整個程式的流程。
- 首先,初始化
start_time變數為當前的時間,lap_number變數為 1,last_time變數為start_time。 - 然後,進入一個無限迴圈,直到使用者按下 Ctrl+C。
- 在迴圈中,程式會等待使用者按下 Enter 鍵,然後計算當前的時間
current_time。 - 接著,計算
lap_time和total_time,分別為當前時間與上一次時間的差值和當前時間與開始時間的差值。 - 然後,印出當前的 lap 號碼、總時間和 lap 時間。
- 最後,更新
lap_number和last_time變數,準備下一次迴圈。
時間模組的使用
時間模組提供了許多有用的函式,例如 time.time() 可以得到當前的時間戳,time.sleep() 可以暫停程式的執行。
datetime 模組的使用
datetime 模組提供了更方便的日期和時間操作。例如,可以使用 datetime.datetime.now() 得到當前的日期和時間,可以使用 datetime.datetime(2026, 10, 21, 16, 29, 0) 得到一個指定的日期和時間。
Ideas for Similar Programs
時間追蹤程式可以應用在許多領域,例如:
- 建立一個簡單的時薪表應用程式,記錄員工的工作時間。
- 在下載檔案時顯示已經花費的時間。
- 定期檢查程式的執行時間,並提供取消長時間執行的任務的選擇。
圖表翻譯
這個圖表顯示了程式的流程,從開始到等待使用者按下 Enter 鍵,然後計算當前的時間,計算 lap 時間和總時間,印出 lap 號碼、總時間和 lap 時間,最後更新 lap 號碼和上一次時間。
時間戳轉換為日期時間物件
可以使用 datetime.datetime.fromtimestamp() 函式將 Unix 時間戳轉換為日期時間物件。這個函式會根據當地時區轉換日期和時間。
日期時間物件比較
可以使用比較運算元來比較兩個日期時間物件,後面的日期時間物件被視為「更大」的值。例如:
import datetime
import time
halloween_2026 = datetime.datetime(2026, 10, 31)
new_years_2027 = datetime.datetime(2027, 1, 1)
print(halloween_2026 == new_years_2027) # False
print(halloween_2026 < new_years_2027) # True
print(new_years_2027 > halloween_2026) # True
時間差
datetime 模組也提供了 timedelta 資料型別,代表時間差。可以使用 timedelta 來計算兩個日期時間物件之間的時間差。例如:
import datetime
halloween_2026 = datetime.datetime(2026, 10, 31)
new_years_2027 = datetime.datetime(2027, 1, 1)
time_diff = new_years_2027 - halloween_2026
print(time_diff) # timedelta 物件
時間戳轉換為日期時間物件範例
import datetime
import time
# 將 Unix 時間戳轉換為日期時間物件
timestamp = 1000000
dt = datetime.datetime.fromtimestamp(timestamp)
print(dt) # datetime.datetime(1970, 1, 12, 5, 46, 40)
# 將目前的 Unix 時間戳轉換為日期時間物件
current_timestamp = time.time()
current_dt = datetime.datetime.fromtimestamp(current_timestamp)
print(current_dt) # datetime.datetime(2026, 10, 21, 16, 30, 0, 604980)
日期時間物件比較範例
import datetime
halloween_2026 = datetime.datetime(2026, 10, 31)
new_years_2027 = datetime.datetime(2027, 1, 1)
print(halloween_2026 == new_years_2027) # False
print(halloween_2026 < new_years_2027) # True
print(new_years_2027 > halloween_2026) # True
時間差範例
import datetime
halloween_2026 = datetime.datetime(2026, 10, 31)
new_years_2027 = datetime.datetime(2027, 1, 1)
time_diff = new_years_2027 - halloween_2026
print(time_diff) # timedelta 物件
使用Python的datetime模組進行日期和時間運算
Python的datetime模組提供了一種簡單的方式來進行日期和時間運算。這個模組包括了幾個類別,例如date、time、datetime、timedelta和tzinfo,可以用來表示和操縱日期和時間。
建立timedelta物件
要建立一個timedelta物件,可以使用datetime.timedelta()函式,並傳入關鍵字引數,例如weeks、days、hours、minutes、seconds、milliseconds和microseconds。
import datetime
delta = datetime.timedelta(days=11, hours=10, minutes=9, seconds=8)
print(delta.days, delta.seconds, delta.microseconds)
這個程式碼會建立一個timedelta物件,表示11天、10小時、9分鐘和8秒,並列印預出這個物件的days、seconds和microseconds屬性。
日期運算
可以使用算術運算子來進行日期運算,例如加法和減法。例如,要計算1000天後的日期,可以使用以下程式碼:
import datetime
now = datetime.datetime.now()
thousand_days = datetime.timedelta(days=1000)
future_date = now + thousand_days
print(future_date)
這個程式碼會計算1000天後的日期,並列印預出結果。
暫停執行直到特定日期
可以使用time.sleep()函式來暫停執行一段時間,但是要暫停執行直到特定日期,可以使用以下程式碼:
import datetime
import time
target_date = datetime.datetime(2039, 10, 31)
while datetime.datetime.now() < target_date:
time.sleep(1)
這個程式碼會暫停執行直到2039年10月31日。
內容解密:
在這個例子中,我們使用了Python的datetime模組來進行日期和時間運算。首先,我們建立了一個timedelta物件,表示11天、10小時、9分鐘和8秒。然後,我們計算了1000天後的日期,並列印預出結果。最後,我們暫停執行直到2039年10月31日。
圖表翻譯:
這個流程圖顯示了我們的程式執行流程,從建立timedelta物件開始,然後計算1000天後的日期,然後暫停執行直到特定日期,最後結束。
時間與日期處理
在 Python 中,datetime 模組提供了強大的時間和日期處理功能。以下是如何使用 datetime 來進行時間和日期的運算和格式化。
時間運算
首先,我們可以建立一個 datetime 物件來代表一個特定的時間點。例如:
import datetime
oct_21st = datetime.datetime(1996, 10, 28, 16, 29)
about_thirty_years = datetime.timedelta(days=30*365)
print(oct_21st - about_thirty_years)
這將輸出 datetime.datetime(1966, 11, 5, 16, 29),即 30 年前的時間點。
時間暫停
如果我們想要暫停程式的執行,直到某個時間點,可以使用 time.sleep() 函式。例如:
import time
import datetime
halloween_2039 = datetime.datetime(2039, 10, 31, 0, 0, 0)
while datetime.datetime.now() < halloween_2039:
time.sleep(1) # 等待 1 秒後再繼續執行
這將使程式暫停執行,直到 2039 年 10 月 31 日。
日期格式化
如果我們想要將 datetime 物件格式化為字串,可以使用 strftime() 方法。例如:
import datetime
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))
這將輸出當前的時間,格式為 YYYY-MM-DD HH:MM:SS。
以下是 strftime() 方法中可用的指令:
| 指令 | 意義 |
|---|---|
%Y | 年份(含世紀) |
%y | 年份(不含世紀) |
%m | 月份(01-12) |
%B | 月份全名(January-December) |
%b | 月份縮寫(Jan-Dec) |
%d | 日(01-31) |
%j | 年中的第幾天(001-366) |
%w | 週中的第幾天(0-6,Sunday-Saturday) |
%A | 周全名(Monday-Sunday) |
這些指令可以用來格式化 datetime 物件為不同的字串格式。
時間函式與日期格式化
Python 的時間函式和日期格式化是處理時間和日期的重要工具。以下是對時間函式和日期格式化的概覽。
時間函式
Python 提供了多種時間函式,包括 time()、localtime()、gmtime()、mktime()、sleep() 等。其中,time() 函式傳回當前時間的 Unix 時間戳,localtime() 函式傳回當地時間的結構化時間,gmtime() 函式傳回 UTC 時間的結構化時間。
日期格式化
Python 的 datetime 模組提供了日期和時間的格式化功能。strftime() 函式可以將日期和時間格式化為字串,strptime() 函式可以將字串解析為日期和時間。
strftime() 函式
strftime() 函式可以將日期和時間格式化為字串。它的語法如下:
datetime.strftime(format)
其中,format 是一個字串,包含了日期和時間的格式化指令。例如:
import datetime
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S")) # 輸出:2023-03-16 14:30:00
strptime() 函式
strptime() 函式可以將字串解析為日期和時間。它的語法如下:
datetime.strptime(string, format)
其中,string 是一個包含了日期和時間的字串,format 是一個字串,包含了日期和時間的格式化指令。例如:
import datetime
date_string = "2023-03-16 14:30:00"
date_object = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
print(date_object) # 輸出:2023-03-16 14:30:00
時間和日期的型別
Python 中有三種型別的時間和日期值:
- Unix 時間戳:是一個浮點數,表示自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數。
- 結構化時間:是一個包含了年、月、日、時、分、秒等資訊的物件。
- 日期和時間物件:是一個包含了年、月、日、時、分、秒等資訊的物件,可以進行日期和時間的運算。
時間與日期處理
時間與日期是程式設計中常見的資料型別,Python 提供了多種方法來處理時間與日期。時間可以被表示為自 1970 年 1 月 1 日午夜以來的秒數,稱為 epoch 時間。
時間相關函式
time.time(): 回傳目前時間的 epoch 時間戳記。time.sleep(seconds): 暫停程式執行指定的秒數。datetime.datetime(year, month, day, hour, minute, second): 回傳一個 datetime 物件,代表指定的時間。datetime.datetime.now(): 回傳目前時間的 datetime 物件。datetime.datetime.fromtimestamp(epoch): 回傳一個 datetime 物件,代表指定的 epoch 時間戳記。
時間差異
時間差異可以使用 timedelta 物件來表示,該物件有多個引數,包括 weeks、days、hours、minutes、seconds、milliseconds 和 microseconds。
時間格式化
strftime(format): 將 datetime 物件格式化為字串,根據指定的格式。strptime(time_string, format): 將字串解析為 datetime 物件,根據指定的格式。
啟動其他程式
Python 可以使用 subprocess 模組啟動其他程式。該模組提供了 run() 函式,可以啟動其他程式,並等待它們結束。
啟動程式
subprocess.run(['程式路徑', '引數1', '引數2']): 啟動指定的程式,並等待它結束。
非同步啟動程式
subprocess.Popen(['程式路徑', '引數1', '引數2']): 啟動指定的程式,不等待它結束。
處理啟動的程式
poll(): 檢查啟動的程式是否已經結束,如果結束則回傳結束程式碼,否則回傳None。wait(): 等待啟動的程式結束,並回傳結束程式碼。kill(): 立即終止啟動的程式。
傳遞命令列引數
subprocess.run(['程式路徑', '引數1', '引數2']): 傳遞命令列引數給啟動的程式。
圖表翻譯:
此圖表示啟動其他程式的流程。首先,啟動指定的程式,然後等待它結束。當程式結束後,取得其結束程式碼,並進行適當的處理。最後,結束整個流程。
使用Python的subprocess模組來執行系統命令
Python的subprocess模組允許你從Python指令碼中執行系統命令。這個模組提供了多種方式來執行命令,包括subprocess.run()、subprocess.Popen()等。
執行命令並接收輸出
你可以使用subprocess.run()來執行命令並接收輸出。例如,以下程式碼會執行ping命令並列印預出輸出:
import subprocess
result = subprocess.run(['ping', '-n', '4', '104.20.120.46'], capture_output=True, text=True)
print(result.stdout)
這會列印預出ping命令的輸出。
使用subprocess.Popen()來執行命令
你也可以使用subprocess.Popen()來執行命令。以下程式碼會執行notepad.exe命令並開啟一個檔案:
import subprocess
proc = subprocess.Popen(['notepad.exe', 'hello.txt'])
使用Task Scheduler、launchd和cron來排程任務
如果你需要在特定時間執行任務,你可以使用Task Scheduler(Windows)、launchd(macOS)或cron(Linux)來排程任務。以下程式碼會使用subprocess.run()來執行ping命令,並使用Task Scheduler來排程任務:
import subprocess
import schedule
import time
def job():
result = subprocess.run(['ping', '-n', '4', '104.20.120.46'], capture_output=True, text=True)
print(result.stdout)
schedule.every(1).minutes.do(job) # 每1分鐘執行一次
while True:
schedule.run_pending()
time.sleep(1)
開啟檔案使用預設應用程式
你可以使用subprocess.run()來開啟檔案使用預設應用程式。以下程式碼會開啟一個txt檔案使用預設應用程式:
import subprocess
subprocess.run(['start', 'hello.txt'], shell=True)
Simple Countdown程式
以下程式碼會實作一個簡單的倒數計時器,並在倒數結束時播放一個音效檔:
import time
import subprocess
time_left = 60
while time_left > 0:
print(time_left)
time.sleep(1)
time_left -= 1
subprocess.run(['start', 'alarm.wav'], shell=True)
這個程式碼會每秒列印一次剩餘時間,並在倒數結束時播放一個音效檔。
時間管理與計時器
時間管理是人們日常生活中非常重要的一部分,能夠有效地管理時間,提高工作效率和生活品質。計時器是一種常見的時間管理工具,可以幫助使用者設定時間提醒、計時和計數。
Unix 時間戳
Unix 時間戳是從 1970 年 1 月 1 日午夜開始計數的秒數,作為電腦系統中時間的標準參考點。Python 的 time 模組提供了 time() 函式,可以傳回自 Unix 時間戳以來的秒數。
時間暫停
time.sleep() 函式可以暫停程式的執行一段時間,單位為秒。這個函式可以用於新增暫停或延遲到程式中。
計時器實作
下面是一個簡單的計時器實作,使用 time.sleep() 函式來暫停程式的執行:
import time
def countdown(t):
while t:
mins, secs = divmod(t, 60)
timer = '{:02d}:{:02d}'.format(mins, secs)
print(timer, end="\r")
time.sleep(1)
t -= 1
print('Time Up!!')
t = input("Enter the time in seconds: ")
countdown(int(t))
這個程式會提示使用者輸入一個時間(以秒為單位),然後開始倒計時,直到時間結束。
音訊提醒
計時器結束後,可以播放一個音訊檔案來提醒使用者。可以使用 subprocess 模組來播放音訊檔案:
import subprocess
# 播放音訊檔案
subprocess.run(['start', 'alarm.wav'], shell=True) # Windows
subprocess.run(['open', 'alarm.wav']) # macOS 和 Linux
需要注意的是,這個程式需要使用者自己提供音訊檔案,並且需要確保音訊檔案的路徑正確。
練習題
- 什麼是 Unix 時間戳?
- 哪個函式傳回自 Unix 時間戳以來的秒數?
- 如何暫停程式的執行 5 秒?
- 如何使用
datetime模組來計算某個日期是星期幾?
練習程式
- 實作一個漂亮的計時器,使用
rjust()和ljust()字串方法來格式化輸出。 - 實作一個簡單的提醒程式,使用
time.sleep()函式來暫停程式的執行,然後播放一個音訊檔案來提醒使用者。
圖表翻譯:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Python時間日期處理與計時器應用
package "Python 應用架構" {
package "應用層" {
component [主程式] as main
component [模組/套件] as modules
component [設定檔] as config
}
package "框架層" {
component [Web 框架] as web
component [ORM] as orm
component [非同步處理] as async
}
package "資料層" {
database [資料庫] as db
component [快取] as cache
component [檔案系統] as fs
}
}
main --> modules : 匯入模組
main --> config : 載入設定
modules --> web : HTTP 處理
web --> orm : 資料操作
orm --> db : 持久化
web --> cache : 快取查詢
web --> async : 背景任務
async --> fs : 檔案處理
note right of web
Flask / FastAPI / Django
end note
@enduml
這個流程圖展示了計時器程式的執行流程,包括設定時間、開始倒計時、暫停程式和播放音訊檔案等步驟。
從使用者經驗的最佳化角度,本文介紹的Python時間追蹤程式,雖功能簡潔,卻展現了時間管理應用的基礎概念。分析其實作方法,可以發現time和datetime模組的靈活運用是其核心,但也存在精確度和跨平臺相容性等方面的挑戰。考慮到程式碼的簡潔性,目前版本較適合輕量級的計時需求,對於複雜的專案管理或多人協作,則需要整合更強大的資料函式庫和使用者介面。展望未來,整合圖形化介面、跨平臺聲音提醒、與日曆應用程式同步等功能,將大幅提升使用者經驗。對於追求效率的使用者,建議結合GUI套件以及更為精確的計時函式庫,打造客製化的時間管理工具。