在前面的復健文章中,我們有提及 Python 內建有許多方便模組 Modules,像是 random
、math
、string
等,裡頭提供的函數、常數可以省去我們自己刻的麻煩,而今天將要介紹的 datatime
模組,也是我們在處理時間格式時,不可或缺的好幫手。
datetime
模組?假設我們想要有一個 today
的變數,裡面可以儲放「此時此刻今天」的日期,想當然爾,我們不可能請工程師全年無休,只為了每天去修改 today
變數的值,這樣的方法太不符合工程師懶惰的個性了。
所以 Python 提供了 datetime
模組來處理日期和時間相關的功能,無論是獲取「今天的日期」、「當下的時間」,或是將使用者輸入的字串轉換為時間格式(例如:將 2022/07/12
轉換成 July, 12, 2022
),有了 datetime
模組,這些事情變得再輕鬆不過。
datetime
模組import datetime
print(dir(datetime)) # 印出 datatime 裡面有的方法
使用 dir
或 help
這些內建指令,可以查看某個模組中可用的函式,讓我們知道 datetime
模組中有什麼可以使用的方法。
# 查看 datetime 的幫助訊息
help(datetime)
datetime
得到時間資訊在 datetime
這個模組中,還有一個名為 datetime
的類別(class),而我們可以使用 datetime
類別裡面的內建方法(函數),來得知時間相關的資訊。
from datetime import datetime
now = datetime.now()
print(now) # 2024-10-02 15:17:21.471908 這會是當下的時間
day = now.day
month = now.month
year = now.year
hour = now.hour
minute = now.minute
second = now.second
timestamp = now.timestamp()
print(day, month, year, hour, minute) # 2 10 2024 15 17
print('timestamp', timestamp) # timestamp 1727853441.471908
print(f'{day}/{month}/{year}, {hour}:{minute}') # 2/10/2024, 15:17
在上述的範例中,所謂的時間戳記(Timestamp) 或著稱作 Unix 時間戳 是從 1970 年 1 月 1 日 UTC 開始計算的秒數。
strftime
來格式化輸出的日期使用 strftime
可以將 datetime
物件轉換成特定的時間格式字串。
from datetime import datetime
new_year = datetime(2020, 1, 1)
print(new_year) # 2020-01-01 00:00:00
day = new_year.day
month = new_year.month
year = new_year.year
hour = new_year.hour
minute = new_year.minute
second = new_year.second
print(day, month, year, hour, minute) # 1 1 2020 0 0
print(f'{day}/{month}/{year}, {hour}:{minute}') # 1/1/2020, 0:0
如果想要瞭解有關 strftime
可以格式化的日期格式,具體格式的符號可以參考這裡。
順道一提,我自己記憶 strftime
這個物件名稱的方式,是透過組合「string + format + time」,也就是「字串格式化時間」。
from datetime import datetime
# 取得目前的日期和時間
now = datetime.now()
t = now.strftime("%H:%M:%S")
print("time:", t) # time: 01:05:01
time_one = now.strftime("%m/%d/%Y, %H:%M:%S")
# mm/dd/YY H:M:S 格式
print("time one:", time_one) # time one: 10/02/2024, 01:05:01
time_two = now.strftime("%d/%m/%Y, %H:%M:%S")
# dd/mm/YY H:M:S 格式
print("time two:", time_two) # time two: 10/02/2024, 01:05:01
上面的範例中提及了一些常用的 strftime
格式符號範例。
strptime
將字串轉換為時間使用 strptime
可以將時間字串解析(parse)為 datetime
物件,我們也可以參考這篇文件了解更多格式。
from datetime import datetime
date_string = "5 December, 2024"
print("date_string =", date_string)
date_object = datetime.strptime(date_string, "%d %B, %Y")
print("date_object =", date_object)
而記憶 strptime
的方式則是「string + parse + time」,也就是所謂的「字串解析組合」。
datetime
中的 date
from datetime import date
d = date(2020, 1, 1)
print(d)
print('目前日期:', d.today()) # 2024-10-02
# 獲得今天的日期物件
today = date.today()
print("今年:", today.year) # 2024
print("這個月:", today.month) # 10
print("今天:", today.day) # 2
from datetime import date, datetime
today = date(year=2024, month=10, day=2)
new_year = date(year=2025, month=1, day=1)
time_left_for_newyear = new_year - today
print('距離新年還有: ', time_left_for_newyear) # 距離新年還有: 91 days, 0:00:00
t1 = datetime(year=2024, month=10, day=2, hour=0, minute=59, second=0)
t2 = datetime(year=2025, month=1, day=1, hour=0, minute=0, second=0)
diff = t2 - t1
print('距離新年還有:', diff) # 距離新年還有: 90 days, 23:01:00
timedelta
計算時間差異如果我們想要了解兩個時間點的差異,例如:12 週與 7 天 在時間上差了多久,在現實中的數學計算,通常我們需要先將兩個時間點轉換成秒數,兩者進行相減之後,再重新轉換為「秒、分、小時、天」的單位,但在 Python 中,有了 timedelta
可以讓這件事輕鬆許多。
from datetime import timedelta
t1 = timedelta(weeks=12, days=10, hours=4, seconds=20)
t2 = timedelta(days=7, hours=5, minutes=3, seconds=30)
t3 = t1 - t2
print("t3 =", t3) # t3 = 86 days, 22:56:50
我還記得當初參加 bootcamp 時,有一次的練習題是:「寫出一個可以轉換時間的函數」,在手刻的過程才知道,原來要實現一個這樣的功能,需要經歷多少運算,而學會如何使用內建方法讓我們省下許多時間,學習程式語言跟已知用火一樣,一旦學會且習慣了,便再也回不去了。