返回文章列表

Python時間日期處理與計時器應用

本文探討 Python 的時間與日期處理技巧,涵蓋 time、datetime 與 subprocess 模組的應用,包含時間戳記、時間間隔計算、日期時間格式化、計時器實作以及利用 subprocess 執行外部程式與音效提醒等功能。文章提供程式碼範例與流程圖,深入淺出地講解時間與日期處理的實務技巧。

程式開發 Python

Python 提供了 timedatetime 模組,方便處理時間和日期相關的操作。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 函式是主函式,負責控制整個程式的流程。

  1. 首先,初始化 start_time 變數為當前的時間,lap_number 變數為 1,last_time 變數為 start_time
  2. 然後,進入一個無限迴圈,直到使用者按下 Ctrl+C。
  3. 在迴圈中,程式會等待使用者按下 Enter 鍵,然後計算當前的時間 current_time
  4. 接著,計算 lap_timetotal_time,分別為當前時間與上一次時間的差值和當前時間與開始時間的差值。
  5. 然後,印出當前的 lap 號碼、總時間和 lap 時間。
  6. 最後,更新 lap_numberlast_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模組提供了一種簡單的方式來進行日期和時間運算。這個模組包括了幾個類別,例如datetimedatetimetimedeltatzinfo,可以用來表示和操縱日期和時間。

建立timedelta物件

要建立一個timedelta物件,可以使用datetime.timedelta()函式,並傳入關鍵字引數,例如weeksdayshoursminutessecondsmillisecondsmicroseconds

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秒,並列印預出這個物件的dayssecondsmicroseconds屬性。

日期運算

可以使用算術運算子來進行日期運算,例如加法和減法。例如,要計算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 中有三種型別的時間和日期值:

  1. Unix 時間戳:是一個浮點數,表示自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數。
  2. 結構化時間:是一個包含了年、月、日、時、分、秒等資訊的物件。
  3. 日期和時間物件:是一個包含了年、月、日、時、分、秒等資訊的物件,可以進行日期和時間的運算。

時間與日期處理

時間與日期是程式設計中常見的資料型別,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 物件來表示,該物件有多個引數,包括 weeksdayshoursminutessecondsmillisecondsmicroseconds

時間格式化

  • 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

需要注意的是,這個程式需要使用者自己提供音訊檔案,並且需要確保音訊檔案的路徑正確。

練習題

  1. 什麼是 Unix 時間戳?
  2. 哪個函式傳回自 Unix 時間戳以來的秒數?
  3. 如何暫停程式的執行 5 秒?
  4. 如何使用 datetime 模組來計算某個日期是星期幾?

練習程式

  1. 實作一個漂亮的計時器,使用 rjust()ljust() 字串方法來格式化輸出。
  2. 實作一個簡單的提醒程式,使用 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時間追蹤程式,雖功能簡潔,卻展現了時間管理應用的基礎概念。分析其實作方法,可以發現timedatetime模組的靈活運用是其核心,但也存在精確度和跨平臺相容性等方面的挑戰。考慮到程式碼的簡潔性,目前版本較適合輕量級的計時需求,對於複雜的專案管理或多人協作,則需要整合更強大的資料函式庫和使用者介面。展望未來,整合圖形化介面、跨平臺聲音提醒、與日曆應用程式同步等功能,將大幅提升使用者經驗。對於追求效率的使用者,建議結合GUI套件以及更為精確的計時函式庫,打造客製化的時間管理工具。