iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Python

初學者的 30 天 Python 復健課程系列 第 18

復健第十八天:操控時間是一種超能力——datetime 模組

  • 分享至 

  • xImage
  •  

前面的復健文章中,我們有提及 Python 內建有許多方便模組 Modules,像是 randommathstring 等,裡頭提供的函數、常數可以省去我們自己刻的麻煩,而今天將要介紹的 datatime 模組,也是我們在處理時間格式時,不可或缺的好幫手。

為什麽需要 datetime 模組?

假設我們想要有一個 today 的變數,裡面可以儲放「此時此刻今天」的日期,想當然爾,我們不可能請工程師全年無休,只為了每天去修改 today 變數的值,這樣的方法太不符合工程師懶惰的個性了。

所以 Python 提供了 datetime 模組來處理日期和時間相關的功能,無論是獲取「今天的日期」、「當下的時間」,或是將使用者輸入的字串轉換為時間格式(例如:將 2022/07/12 轉換成 July, 12, 2022),有了 datetime 模組,這些事情變得再輕鬆不過。

如何匯入 datetime 模組

import datetime
print(dir(datetime)) # 印出 datatime 裡面有的方法

使用 dirhelp 這些內建指令,可以查看某個模組中可用的函式,讓我們知道 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 時,有一次的練習題是:「寫出一個可以轉換時間的函數」,在手刻的過程才知道,原來要實現一個這樣的功能,需要經歷多少運算,而學會如何使用內建方法讓我們省下許多時間,學習程式語言跟已知用火一樣,一旦學會且習慣了,便再也回不去了。

https://ithelp.ithome.com.tw/upload/images/20241002/20167668ARgdPjACtU.png


上一篇
復健第十七天:寫程式就是一場錯誤 Type Errors 的冒險
下一篇
復健第十九天:啊有錯誤又怎樣,try try 看就知道
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言