如何使用 Python datetime 模組處理日期時間?Python datetime 模組介紹

閱讀 19:38·字數 5893·更新 
Youtube 頻道
訂閱 133

本節內容不涉及 Python 日期時間與字串之間的轉換,日期時間的格式化以及時區,要了解他們,你可以檢視內容分類一段列出的章節。

Python datetime 模組

Python 的datetime模組擁有多個類別,比如datetimedatetime,他們提供了與日期時間相關的功能,可完成絕大部分的日期時間操作。其中,類別datetime繼承自類別date

Python datetime 模組所允許的最小和最大日期時間

Pythondatetime模組的兩個變數MINYEARMAXYEAR,分別表示所允許的最小年份和最大年份,其中MINYEAR1MAXYEAR9999

Pythondatetime模組的date類別的類別變數minmax,分別表示所允許的最小日期和最大日期,其中min等價於運算式date(MINYEAR,1,1)運算得到的date物件,max等價於運算式date(MAXYEAR,12,31)運算得到的date物件。

Pythondatetime模組的time類別的類別變數minmax,分別表示所允許的最小時間和最大時間,其中min等價於運算式time(0,0,0,0)運算得到的time物件,max等價於運算式time(23,59,59,999999)運算得到的time物件。

Pythondatetime模組的datetime類別的類別變數minmax,分別表示所允許的最小日期時間和最大日期時間,其中min等價於運算式datetime(MINYEAR,1,1,tzinfo=None)運算得到的datetime物件,max等價於運算式datetime(MAXYEAR,12,31,23,59,59,999999,tzinfo=None)運算得到的datetime物件。

date|time|datetime.min
date|time|datetime.max

import datetime
# 最小年份
datetime.MINYEAR
1
# 最大年份
datetime.MAXYEAR
9999
# 最小日期
datetime.date.min
datetime.date(1, 1, 1)
# 最大日期
datetime.date.max
datetime.date(9999, 12, 31)
# 最小時間
datetime.time.min
datetime.time(0, 0)
# 最大時間
datetime.time.max
datetime.time(23, 59, 59, 999999)
# 最小日期時間
datetime.datetime.min
datetime.datetime(1, 1, 1, 0, 0)
# 最大日期時間
datetime.date.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)

Python datetime 模組的 date 類別

Pythondatetime模組的date類別,用於表示一個日期,該日期包含了年,月和日的資訊,其建構子的形式如下。如果傳遞給建構子的參數不能正確的表示一個日期,那麽建構子將擲回例外狀況ValueError

date(year, month, day)

year 參數

year參數表示年份,其值需要大於或等於datetime模組的MINYEAR變數,並小於或等於datetime模組的MAXYEAR變數。

month 參數

month參數表示月份,其值需要大於或等於1,並小於或等於12

day 參數

day參數表示datetime物件對應的日期是月份中的第幾天,其值需要大於或等於1,並小於或等於月份允許的最大天數。

from datetime import date
# 建立 date 物件
date(9999, 1, 1)
datetime.date(9999, 1, 1)
# day 參數不正確
date(9999, 1, 100)

ValueError: day is out of range for month

Python datetime 模組的 time 類別

Pythondatetime模組的time類別,用於表示一天中的某個特定時間,該時間包含了小時,分,秒,微秒等資訊,其建構子的形式如下。如果傳遞給建構子的參數不能正確的表示一個時間,那麽建構子將擲回例外狀況ValueError

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

hour 參數

hour參數表示時間的小時部分,其值需要大於或等於0,並小於24

minute 參數

minute參數表示時間的分鐘部分,其值需要大於或等於0,並小於60

second 參數

second參數表示時間的秒數部分,其值需要大於或等於0,並小於60

microsecond 參數

microsecond參數表示時間的微秒部分,其值需要大於或等於0,並小於1000000

tzinfo 參數

tzinfo參數為時間對應的時區物件。

fold 參數

fold參數用於消除歧義,其取值可以是01。如果參數tzinfo所指定的時區物件未在其相關方法中使用參數fold,那麽fold的取值是無關緊要的。

from datetime import time
# 建立 time 物件
time(8, 59, 0, 123456)
datetime.time(8, 59, 0, 123456)
# second 參數不正確
time(15, 0, 60)

ValueError: second must be in 0..59

Python datetime 模組的 datetime 類別

Pythondatetime模組的datetime類別,用於表示一個特定的日期時間,該日期時間包含了年,月,日,小時,分,秒,微秒等資訊,其建構子的形式如下,建構子的參數的含義與datetime類別的建構子相同。如果傳遞給建構子的參數不能正確的表示一個日期時間,那麽建構子將擲回例外狀況ValueError

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

from datetime import datetime
# 建立 datetime 物件
datetime(2024, 12, 30)
datetime.datetime(2024, 12, 30, 0, 0)

使用 Python datetime 模組取得日期時間資訊

Pythondatetime模組的datetimedatetime物件具有以下唯讀屬性,可用於取得與日期時間相關的資訊。其中,year屬性表示年份,month屬性表示月份(112),day屬性表示一月中的第幾天,hour屬性表示小時(023),minute屬性表示分鐘(059),second屬性表示秒數(059),microsecond屬性表示微秒數(0999999),tzinfo屬性是表示時區資訊的tzinfo物件,fold屬性的取值為01,表示如何消除歧義。

date|datetime.year
date|datetime.month
date|datetime.day
time|datetime.hour
time|datetime.minute
time|datetime.second
time|datetime.microsecond
time|datetime.tzinfo
time|datetime.fold

Pythondatetime模組的datetime物件的date方法,可用於取得日期時間對應的日期,其傳回值是一個新的date物件,擁有與原datetime物件相同的yearmonth以及day屬性。

Pythondatetime模組的datetime物件的timetz方法,可用於取得日期時間對應的時間,其傳回值是一個新的time物件,擁有與原datetime物件相同的hourminutesecondmicrosecondtzinfo以及fold(需要 Python 3.6 或更高版本)屬性。datetime物件的time方法與timetz方法類似,只不過其傳回的time物件的tzinfo屬性為空值None

datetime.date()
datetime.timetz()
datetime.time()

Pythondatetime模組的datedatetime物件的timetuple方法,其傳回值是time模組的struct_time物件,該物件包含了一些與日期時間相關的屬性。

date|datetime.timetuple()

from datetime import date, time, datetime, timezone
# 取得年份
date(2024, 1, 1).year
2024
# 取得微秒數
datetime.today().microsecond
573657
# 取得秒數
time(1, 30, 59).second
59
dt = datetime(2024, 9, 25, 8, 30, 0, 1234, timezone.utc, fold=1)
# 取得日期時間中的時間,不帶時區
dt.time()
datetime.time(8, 30, 0, 1234, fold=1)
# 取得日期時間中的時間,帶時區
dt.timetz()
datetime.time(8, 30, 0, 1234, tzinfo=datetime.timezone.utc, fold=1)
# 取得 struct_time
dt.timetuple()
time.struct_time(tm_year=2024, tm_mon=9, tm_mday=25, tm_hour=8, tm_min=30, tm_sec=0, tm_wday=2, tm_yday=269, tm_isdst=-1)

使用 Python datetime 模組修改日期時間

Pythondatetime模組的datetimedatetime物件的replace方法會使用原有物件來建立新的物件,並根據給出的參數來取代原有的日期時間資訊,其參數含義與相關類別的建構子的參數含義相同。

date.replace(year=self.year, month=self.month, day=self.day)
time.replace(hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=self.fold)
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=self.fold)

你無法修改 Python datetime 模組的 date,time,datetime 物件所表示的日期時間

你無法通過 Pythondatetime模組的datetimedatetime物件的相關屬性來修改日期時間,這些屬性是唯讀的,比如year屬性。Python 的設計者並不希望日期時間被改動,即便通過datetimedatetime物件的replace方法,因為該方法會傳回一個新的物件。

時區

如果你希望將datetime物件轉換為某個時區對應的日期時間而不是簡單的取代時區資訊,那麽可以檢視通過 Python datetime 模組的 tzinfo 物件為日期時間轉換時區一段。

from datetime import date, time, datetime
# 根據原有日期時間建立新的日期時間
date(2024, 1, 1).replace(2023)
datetime.date(2023, 1, 1)
time(23, 59, 59, 1234).replace(microsecond=4321)
datetime.time(23, 59, 59, 4321)
datetime(2024, 1, 1, 23, 59, 59, fold=1).replace(month=3)
datetime.datetime(2024, 3, 1, 23, 59, 59, fold=1)

使用 Python datetime 模組取得日期時間的 POSIX 時間戳記

Pythondatetime模組的datetime物件的方法timestamp,可用於取得datetime物件所表示的日期時間的 POSIX 時間戳記,該方法的傳回值是一個浮點數。

datetime.timestamp()

Python 中的 POSIX 時間戳記

POSIX 時間戳記是一個數值,他表示某個日期時間與國際標準日期時間(UTC) 1970 年 1 月 1 日 0 時 0 分 0 秒之間的差值。在 Python 中,POSIX 時間戳記被表示為浮點數,浮點數的整數部分對應了秒數,浮點數的小數部分對應了微秒。

from datetime import datetime
# 取得本機日期時間的時間戳記
datetime.today().timestamp()
1727179679.344979

使用 Python datetime 模組取得 POSIX 時間戳記對應的日期時間

Pythondatetime模組的date類別的類別方法fromtimestamp,可用於取得某個 POSIX 時間戳記對應的日期(不包含時間資訊),該方法的傳回值是一個date物件。

date.fromtimestamp(timestamp)

timestamp 參數

timestamp參數為表示 POSIX 時間戳記的浮點數。

Pythondatetime模組的datetime類別的類別方法fromtimestamp,可用於取得某個 POSIX 時間戳記對應的日期時間,該方法的傳回值是一個datetime物件。

datetime.fromtimestamp(timestamp, tz=None)

timestamp 參數

timestamp參數為表示 POSIX 時間戳記的浮點數。

tz 參數

tz參數為表示時區資訊的tzinfo物件,方法會將 POSIX 時間戳記轉換為對應時區的日期時間並傳回。如果忽略該參數或將該參數設定為None,則直接傳回目前的本機日期時間。

在 Python 3.12 和之後的版本中,datetime類別的類別方法utcfromtimestamp已經被取代,他可用於取得 POSIX 時間戳記對應的國際標準日期時間(UTC)。

Python datetime 模組不能轉換所有的 POSIX 時間戳記

Pythondatetime模組不能將所有 POSIX 時間戳記轉換為日期時間,比如,時間戳記對應的浮點數太大,將小於0的時間戳記轉換為小於 1970 年 1 月 1 日 0 時 0 分 0 秒的國際標準日期時間(可以轉換時間戳記0)。如果時間戳記轉換失敗,那麽可能會擲回 Python 例外狀況OSError

from datetime import date, datetime, timezone
# 將時間戳記轉換為日期
date.fromtimestamp(1727246240.124616)
datetime.date(2024, 9, 25)
# 將時間戳記轉換為日期時間
datetime.fromtimestamp(1727246240.124616)
datetime.datetime(2024, 9, 25, 14, 37, 20, 124616)
datetime.fromtimestamp(1727246240.124616, timezone.utc)
datetime.datetime(2024, 9, 25, 6, 37, 20, 124616, tzinfo=datetime.timezone.utc)
# 時間戳記不能小於 0
date.fromtimestamp(-1)

OSError: [Errno ] Invalid argument

使用 Python datetime 模組取得目前的日期時間

Pythondatetime模組的date類別的類別方法today,可用於取得目前的本機日期(不包含時間資訊),該方法的傳回值是一個date物件。

date.today()

Pythondatetime模組的datetime類別的類別方法todaynow,可用於取得目前的本機日期時間或其在指定時區對應的日期時間,該方法的傳回值是一個datetime物件。

datetime.today()
datetime.now(tz=None)

tz 參數

tz參數為表示時區資訊的tzinfo物件,方法會將目前的本機日期時間轉換為對應時區的日期時間並傳回。如果忽略該參數或將該參數設定為None,則直接傳回目前的本機日期時間。

在 Python 3.12 和之後的版本中,datetime類別的類別方法utcnow已經被取代,他可用於取得目前的國際標準日期時間(UTC)。

from datetime import date, datetime, timezone
# 取得目前的本機日期
date.today()
datetime.date(2024, 9, 24)
# 取得目前的本機日期時間
datetime.today()
datetime.datetime(2024, 9, 24, 20, 53, 38, 244890)
datetime.now()
datetime.datetime(2024, 9, 24, 20, 54, 9, 974196)
# 取得目前的本機日期時間對應的 UTC 日期時間
datetime.now(timezone.utc)
datetime.datetime(2024, 9, 24, 12, 54, 51, 164800)

使用 Python datetime 模組取得日期時間是一周中的第幾天

Pythondatetime模組的datedatetime物件的方法weekday,其傳回值是一個整數,該整數表示日期時間是一周中的第幾天,即當周日次(0表示星期一,6表示星期日)。

Pythondatetime模組的datedatetime物件的方法isoweekday與方法weekday類似,只不過傳回1表示星期一而不是星期二(7表示星期日)。

date|datetime.weekday()
date|datetime.isoweekday()

from datetime import date, datetime
# 取得當周日次
date(2024, 9, 25).weekday()
2
datetime(2024, 9, 25, 23, 59, 59).isoweekday()
3

使用 Python datetime 模組取得日期時間的行事歷資訊

Pythondatetime模組的datedatetime物件的方法isocalendar,其傳回值是一個具名元組(可通過元組變數來存取元組中的元素),該元組包含變數yearweekweekday,他們分別表示日期時間的年份,是一年中的第幾周(1表示第一周),是一周中的第幾天(1表示星期一)。

date|datetime.isocalendar()

from datetime import date, datetime
# 取得行事歷資訊
date(2024, 9, 25).isocalendar()
datetime.IsoCalendarDate(year=2024, week=39, weekday=3)
datetime(2024, 9, 25, 23, 59, 59).isocalendar()
datetime.IsoCalendarDate(year=2024, week=39, weekday=3)

使用 Python datetime 模組取得行事歷資訊對應的日期時間

Pythondatetime模組的datedatetime類別的類別方法fromisocalendar(需要 Python 3.8 或更高版本),將根據給出的行事歷資訊,傳回其對應的日期(date物件)或日期時間(datetime物件)。

date|datetime.fromisocalendar(year, week, day)

year 參數

year參數表示年份,最終得到的日期或日期時間的年份可能與year參數不同。

week 參數

week參數表示日期時間是一年中的第幾周(1表示第一周)。

day 參數

day參數表示日期時間是一周中的第幾天(1表示星期一)。

from datetime import date, datetime
# 取得行事歷資訊對應的日期
date.fromisocalendar(2024, 39, 3)
datetime.date(2024, 9, 25)
# 取得行事歷資訊對應的日期時間
datetime.fromisocalendar(2024, 39, 3)
datetime.datetime(2024, 9, 25, 0, 0)

使用 Python datetime 模組取得日期,時間,時區對應的日期時間

Pythondatetime模組的datetime類別的類別方法combine,可根據已有的日期(date物件),時間(time物件)以及時區資訊建立新的日期時間(datetime物件)。

datetime.combine(date, time, tzinfo=time.tzinfo)

date 參數

date參數為用來建立日期時間的date物件。

time 參數

time參數為用來建立日期時間的time物件。

tzinfo 參數

tzinfo參數為用來建立日期時間的時區資訊物件,如果忽略該參數,則將采用time參數的tzinfo屬性。

from datetime import date, time, datetime, timezone
# 根據日期,時間,時區建立日期時間
datetime.combine(date(2024, 9, 25), time(0, 0, 0, tzinfo=timezone.utc))
datetime.datetime(2024, 9, 25, 0, 0, tzinfo=datetime.timezone.utc)
datetime.combine(date(2024, 9, 25), time(0, 0, 0, tzinfo=timezone.utc), None)
datetime.datetime(2024, 9, 25, 0, 0)

使用 Python datetime 模組取得日期時間在西元紀年法中的序號

Pythondatetime模組的datedatetime物件的方法toordinal,其傳回值是一個整數,可用於取得日期時間在西元紀年法中的序號(西元 1 年 1 月 1 日對應的序號為1,以此類推)。

date|datetime.toordinal()

from datetime import date, datetime
# 2024 年 9 月 25 日在西元紀年法中的序號
date(2024, 9, 25).toordinal()
739154
# 2024 年 9 月 25 日 23 時 59 分 59 秒在西元紀年法中的序號
datetime(2024, 9, 25, 23, 59, 59).toordinal()
739154

使用 Python datetime 模組取得西元紀年序號對應的日期時間

Pythondatetime模組的datedatetime類別的類別方法fromordinal,可用於取得西元紀年序號(1對應西元 1 年 1 月 1 日,以此類推)對應的日期時間,其傳回值是一個datedatetime物件。如果傳回值是datetime物件,那麽其表示的時,分,秒,微秒均為0,其屬性tzinfoNone

date|datetime.fromordinal(ordinal)

ordinal 參數

ordinal參數為表示西元紀年序號的整數,該值不能小於1或大於運算式datetime.max.toordinal()的計算結果,否則可能會引發例外狀況ValueError

from datetime import date, datetime
# 取得西元紀年法序號 1 對應的日期
date.fromordinal(1)
datetime.date(1, 1, 1)
# 取得西元紀年法序號 2 對應的日期時間
datetime.fromordinal(2)
datetime.datetime(1, 1, 2, 0, 0)
# 序號不能小於 1
datetime.fromordinal(0)

ValueError: ordinal must be >= 1

內容分類