如何使用 Python datetime 模块处理日期时间?Python datetime 模块介绍
本节内容不涉及 Python 日期时间与字符串之间的转换,日期时间的格式化以及时区,要了解他们,你可以查看内容分类一段列出的章节。
Python datetime 模块
Python 的datetime
模块拥有多个类,比如datetime
,date
,time
,他们提供了与日期时间相关的功能,可完成绝大部分的日期时间操作。其中,类datetime
继承自类date
。
Python datetime 模块所允许的最小和最大日期时间
Pythondatetime
模块的两个变量MINYEAR
和MAXYEAR
,分别表示所允许的最小年份和最大年份,其中MINYEAR
为1
,MAXYEAR
为9999
。
Pythondatetime
模块的date
类的类变量min
和max
,分别表示所允许的最小日期和最大日期,其中min
等价于表达式date(MINYEAR,1,1)
运算得到的date
对象,max
等价于表达式date(MAXYEAR,12,31)
运算得到的date
对象。
Pythondatetime
模块的time
类的类变量min
和max
,分别表示所允许的最小时间和最大时间,其中min
等价于表达式time(0,0,0,0)
运算得到的time
对象,max
等价于表达式time(23,59,59,999999)
运算得到的time
对象。
Pythondatetime
模块的datetime
类的类变量min
和max
,分别表示所允许的最小日期时间和最大日期时间,其中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
参数用于消除歧义,其取值可以是0
或1
。如果参数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
类,用于表示一个特定的日期时间,该日期时间包含了年,月,日,小时,分,秒,微秒等信息,其构造器的形式如下,构造器的参数的含义与date
,time
类的构造器相同。如果传递给构造器的参数不能正确的表示一个日期时间,那么构造器将抛出异常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
模块的date
,time
和datetime
对象具有以下只读属性,可用于获取与日期时间相关的信息。其中,year
属性表示年份,month
属性表示月份(1
至12
),day
属性表示一月中的第几天,hour
属性表示小时(0
至23
),minute
属性表示分钟(0
至59
),second
属性表示秒数(0
至59
),microsecond
属性表示微秒数(0
至999999
),tzinfo
属性是表示时区信息的tzinfo
对象,fold
属性的取值为0
或1
,表示如何消除歧义。
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
对象相同的year
,month
以及day
属性。
Pythondatetime
模块的datetime
对象的timetz
方法,可用于获取日期时间对应的时间,其返回值是一个新的time
对象,拥有与原datetime
对象相同的hour
,minute
,second
,microsecond
,tzinfo
以及fold
(需要 Python 3.6 或更高版本)属性。datetime
对象的time
方法与timetz
方法类似,只不过其返回的time
对象的tzinfo
属性为空值None
。
datetime.date()
datetime.timetz()
datetime.time()
Pythondatetime
模块的date
和datetime
对象的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
模块的date
,time
和datetime
对象的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
模块的date
,time
和datetime
对象的相关属性来修改日期时间,这些属性是只读的,比如year
属性。Python 的设计者并不希望日期时间被改动,即便通过date
,time
和datetime
对象的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
类的类方法today
和now
,可用于获取当前的本地日期时间或其在指定时区对应的日期时间,该方法的返回值是一个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
模块的date
和datetime
对象的方法weekday
,其返回值是一个整数,该整数表示日期时间是一周中的第几天,即星期几(0
表示星期一,6
表示星期日)。
Pythondatetime
模块的date
和datetime
对象的方法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
模块的date
和datetime
对象的方法isocalendar
,其返回值是一个具名元组(可通过元组变量来访问元组中的元素),该元组包含变量year
,week
,weekday
,他们分别表示日期时间的年份,是一年中的第几周(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
模块的date
和datetime
类的类方法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
模块的date
和datetime
对象的方法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
模块的date
和datetime
类的类方法fromordinal
,可用于获取公元纪年序号(1
对应公元 1 年 1 月 1 日,以此类推)对应的日期时间,其返回值是一个date
或datetime
对象。如果返回值是datetime
对象,那么其表示的时,分,秒,微秒均为0
,其属性tzinfo
为None
。
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