日期和時間 datetime
Python 的標準函式「datetime」提供不少處理日期和時間的方法,可以取得目前的日期或時間,並進一步進行相關的運算。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
datetime 常用方法
datetime 有下列幾種處理日期和時間的方法 ( 參考 Python 官方文件:datetime ):
方法 | 說明 |
---|---|
date | 處理日期 |
time | 處理時間 |
datetime | 處理 date 和 time 混合的物件 |
timedelta | 處理時間差 |
timezone | 處理時區資訊 |
import datetime
要使用 datetime 必須先 import datetime 模組,或使用 from 的方式,單獨 import 特定的類型。
import datetime
from datetime import date
date
datetime.date 可以處理日期相關的操作,本身包含三個屬性:year、month 和 day,分別用逗號區隔,下方的程式會印出指定的日期。
import datetime
d = datetime.date(2020,1,1) # 2020-01-01
datetime.date 有一個主要的方法可以使用,下方的程式執行了 today() 的方法,印出今天的日期 ( 使用 ISO 格式的日期字串 )。
方法 | 說明 |
---|---|
today() | 回傳目前的西元年、月、日 |
import datetime
today = datetime.date.today()
print(today) # 2021-10-19
取得日期後,可以使用下面幾種常用的方法,進一步取出日期的資訊進行操作。
方法 | 說明 |
---|---|
year | 取得西元年 |
month | 取得月份 |
day | 取得日期 |
replace() | 取代日期,產生新的物件 |
weekday() | 回傳一星期中的第幾天,星期一為 0 |
isoweekday() | 回傳一星期中的第幾天,星期一為 1 |
isocalendar() | 回傳一個 tuple,內容分別是 ( 年、第幾週、isoweekday ) |
isoformat() | 回傳 ISO 格式的日期字串 |
ctime() | 回傳日期和時間的字串 |
strftime() | 回傳特定格式字串所表示的時間 ( 詳細可參考 strftime() 和 strptime() ) |
import datetime
today = datetime.date.today()
print(today) # 2021-10-19
print(today.year) # 2021
print(today.month) # 10
print(today.day) # 19
print(today.weekday()) # 1 ( 因為是星期二,所以是 1 )
print(today.isoweekday()) # 2 ( 因為是星期二,所以是 2 )
print(today.isocalendar()) # (2021, 42, 2) ( 第三個數字是星期二,所以是 2 )
print(today.isoformat()) # 2021-10-19
print(today.ctime()) # Tue Oct 19 00:00:00 2021
print(today.strftime('%Y.%m.%d')) # 2021.10.19
newDay = today.replace(year=2020)
print(newDay) # 2020-10-19
下方的程式執行後,會利用「.days」的屬性,計算出兩個日期差了幾天。
import datetime
d1 = datetime.date(2020, 6, 24)
d2 = datetime.date(2021, 11, 24)
print(abs(d1-d2).days) # 518
time
datetime.time 可以處理時間相關的操作,本身包含下列幾個屬性:hour、minute、second、microsecond 和 tzinfo,分別用逗號區隔,下方的程式會印出指定的時間。
import datetime
thisTime = datetime.time(12,0,0,1)
print(thisTime) # 12:00:00.000001
tzinfo 是時區的選項,預設 None 採用 UTC 時區,如果要轉換成台灣 UTC+8 的時區可採用下方的寫法:
import datetime
thisTime = datetime.time(14,0,0,1,tzinfo=datetime.timezone(datetime.timedelta(hours=8)))
print(thisTime) # 14:00:00.000001+08:00
使用 datetime.time 將字串轉換為時間物件後,就能透過下面幾種常用的方法,取出時間的資訊進行下一步操作。
方法 | 說明 |
---|---|
hour | 取得小時 |
minute | 取得分鐘 |
second | 取得秒數 |
microsecond | 取得微秒數 (1/1000000 秒) |
replace() | 取代時間,產生新的物件 |
isoformat() | 回傳 ISO 格式的時間字串 |
tzname() | 回傳目前時區資訊 |
strftime() | 回傳特定格式字串所表示的時間 ( 詳細可參考 strftime() 和 strptime() ) |
import datetime
thisTime = datetime.time(14,0,0,1,tzinfo=datetime.timezone(datetime.timedelta(hours=8)))
print(thisTime) # 14:00:00.000001+08:00
print(thisTime.isoformat()) # 14:00:00.000001+08:00
print(thisTime.tzname()) # UTC+08:00
print( thisTime.strftime('%H:%M:%S')) # 14:00:00
newTime = today.replace(hour=20)
print(newTime) # 20:00:00.000001+08:00
datetime
datetime.datetime 可以處理日期與時間相關的操作,本身包含下列幾個屬性:year、month、dayhour、minute、second、microsecond 和 tzinfo,分別用逗號區隔,下方的程式會印出指定的日期和時間。
import datetime
thisTime = datetime.datetime(2020,1,1,20,20,20,20)
print(thisTime) # 2020-01-01 20:20:20.000020
datetime.datetime 有下面幾個主要的方法可以使用:
方法 | 說明 |
---|---|
today() | 回傳目前的日期與時間 |
now() | 回傳目前的日期與時間,可加入 tz 參數設定時區 |
utcnow() | 回傳目前的日期與時間 |
import datetime
print(datetime.datetime.today()) # 2021-10-19 06:15:46.022925
print(datetime.datetime.now(tz=datetime.timezone(datetime.timedelta(hours=8))))
# 2021-10-19 14:15:46.027982+08:00
print(datetime.datetime.utcnow()) # 2021-10-19 06:15:46.028630
使用 datetime.datetime 將字串轉換為日期時間物件後,就能透過下面幾種常用的方法,將取出的日期時間資訊進行下一步操作。
方法 | 說明 |
---|---|
year | 取得西元年 |
month | 取得月份 |
day | 取得日期 |
hour | 取得小時 |
minute | 取得分鐘 |
second | 取得秒數 |
microsecond | 取得微秒數 (1/1000000 秒) |
weekday() | 回傳一星期中的第幾天,星期一為 0 |
isoweekday() | 回傳一星期中的第幾天,星期一為 1 |
isocalendar() | 回傳一個 tuple,內容分別是 ( 年、第幾週、isoweekday ) |
isoformat() | 回傳 ISO 格式的日期字串 |
ctime() | 回傳日期和時間的字串 |
timetuple() | 回傳日期與時間所組成的 time.struct_time 物件 |
strftime() | 回傳特定格式字串所表示的時間 ( 詳細可參考 strftime() 和 strptime() ) |
import datetime
now = datetime.datetime.now(tz=datetime.timezone(datetime.timedelta(hours=8)))
print(now) # 2021-10-19 14:25:46.962975+08:00
print(now.date()) # 2021-10-19
print(now.time()) # 14:25:46.962975
print(now.tzname()) # UTC+08:00
print(now.weekday()) # 1
print(now.isoweekday()) # 2
print(now.isocalendar()) # (2021, 42, 2)
print(now.isoformat()) # 2021-10-19 14:25:46.962975+08:00
print(now.ctime()) # Tue Oct 19 14:48:38 2021
print(now.strftime('%Y/%m/%d %H:%M:%S')) # 2021/10/19 14:48:38
print(now.timetuple()) # time.struct_time(tm_year=2021, tm_mon=10, tm_mday=19, tm_hour=16, tm_min=8, tm_sec=6, tm_wday=1, tm_yday=292, tm_isdst=-1)
timedelta
如果要進行日期或時間的計算,可以透過 datetime.timedelta 增加或減少日期或時間,本身包含 days、seconds、microseconds、milliseconds、minutes、hours、weeks 的屬性,屬性的預設值都是 0。
使用 datetime.timedelta 只需要將其放在日期或時間物件後方,就回傳計算後的時間,下方的程式會計算出昨天、明天、下星期同一天的日期。
import datetime
today = datetime.datetime.now()
yesterday = today - datetime.timedelta(days=1)
tomorrow = today + datetime.timedelta(days=1)
nextweek = today + datetime.timedelta(weeks=1)
print(today) # 2021-10-19 07:01:22.669886
print(yesterday) # 2021-10-18 07:01:22.669886
print(tomorrow) # 2021-10-20 07:01:22.669886
print(nextweek) # 2021-10-26 07:01:22.669886
timezone
datetime.timezone 負責時區的轉換,主要和 datetime.datetime、datetime.time 互相搭配使用。
datetime.timedelta 裡 hours 的數值,可以參考:時區列表,台灣處在 GMT+8 的時區,所以 hours 等於 8,如果是日本,因為是 GTM+9,hours 就要設定為 9。
import datetime
tzone = datetime.timezone(datetime.timedelta(hours=8))
now = datetime.datetime.now(tz=tzone)
print(now) # 2021-10-19 15:07:51.128092+08:00
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~