Python标准库datetime date模块详解与实战
本文详细介绍Python标准库中datetime.date模块的核心用法。涵盖日期对象的创建、属性获取、常见错误排查,以及ctime、replace、strftime、isoformat等常用函数的具体实现。通过代码示例解析日期格式化、星期计算、时间戳转换及ISO标准格式处理,帮助开发者高效进行日期时间编程。
前言
Python内置了datetime标准库用于处理日期和时间,主要包含date、time和datetime三个模块。其中,date模块专注于日期操作,time模块处理时间部分,而datetime模块则整合了日期与时间的功能。本文将深入解析date模块中常用函数的具体使用方法。
日期对象类:
- 日期对象包含三个核心属性:年份、月份和日。
- 使用date()函数可以创建日期对象。
- date()函数能够将传入的参数转换为datetime.date类型。
- 调用date()时,若采用位置传参,参数顺序必须严格为:年份、月份、日。
- date()函数的参数取值范围有严格限制:年份需在1至9999之间,月份需在1至12之间,日需在1至31之间。
1、定义
- 使用前需先导入datetime库。
# coding:utf-8
import datetime
now_date = datetime.date(2022, 12, 26)
print(now_date)
1.2、常见错误
- 报错情形之一:缺少必需参数。
- 报错情形之二:位置传参时,参数值超出允许范围。
# coding:utf-8
import datetime
print(datetime.date(2022, 12, 26))
print(type(datetime.date(2022, 12, 26))) # <class 'datetime.date'>
# 下面的代码报错,缺少参数
# print(datetime.date(2022, 12)) # TypeError: function missing required argument 'day' (pos 3)
# 下面的代码提示值错误,date()函数的参数依次为 年份、月份、日;年份的范围是1-9999,月份的范围是1-12,日的范围是1-31
# print(datetime.date(10001, 12, 12)) # ValueError: year 10001 is out of range
# print(datetime.date(2022, 13, 12)) # ValueError: month must be in 1..12
# print(datetime.date(2022, 12, 32)) # ValueError: day is out of range for month
# 关键字传传参,只要保证年份、月份、天的值都在可用范围内,位置不受影响
print(datetime.date(day=15, year=2029, month=12))
2、date类常用的函数
2.1、获取当期日期
# coding:utf-8
import datetime
print(datetime.date.today()) # 2022-07-08
print(type(datetime.date.today())) # <class 'datetime.date'>
2.2、格式化日期
2.2.1、ctime()
- ctime()函数用于将datetime.date对象转换为可读的日期时间格式字符串。
- 注意:ctime()函数的参数必须是datetime.date类型。
print(datetime.date.ctime(datetime.date.today())) # Fri Jul 8 00:00:00 2022
print(type(datetime.date.ctime(datetime.date.today()))) # <class 'str'>
# ctime()函数的参数必须是 datetime.date类型
print(datetime.date.ctime(datetime.date(2022, 12, 26))) # Mon Dec 26 00:00:00 2022
2.2.2、datetime.date对象
datetime_1 = datetime.date(2022, 12, 26)
# 获取日期对象的日,返回的值为int类型
print(datetime_1.day, type(datetime_1.day), type(datetime_1)) # 26 <class 'int'> <class 'datetime.date'>
# 获取日期对象的月,返回的值亦为int类型
print(datetime_1.month, type(datetime_1.month), type(datetime_1)) # 12 <class 'int'> <class 'datetime.date'>
# 获取日期对象的年,返回的值亦为int类型
print(datetime_1.year, type(datetime_1.year), type(datetime_1)) # 2022 <class 'int'> <class 'datetime.date'>

2.2.3、replace(self, year=None, month=None, day=None)
- 该方法用于替换datetime.date对象中的日期值。
- replace()函数包含一个必传参数(原日期对象)和三个可选参数(year、month、day,默认值为None)。
- year参数指定要替换的年份。
- month参数指定要替换的月份。
- day参数指定要替换的日。
datetime_1 = datetime.date(2022, 12, 26)
print(datetime.date.replace(datetime_1, year=2019, month=11, day=25)) # 2019-11-25
print(type(datetime.date.replace(datetime_1, year=2019, month=11, day=25))) # <class 'datetime.date'>
print(datetime_1)
# 必须有一个日期或者时间对象的参数,不传替换参数即返回传入的datetime.date对象的值
print(datetime.date.replace(datetime_1)) # 2022-12-26
# 只替换年度
print(datetime.date.replace(datetime_1, year=2019)) # 2019-12-26
# 只替换月份
print(datetime.date.replace(datetime_1, month=11)) # 2022-11-26
# 只替换日
print(datetime.date.replace(datetime_1, day=25)) # 2022-12-25
通过观察示例可知,替换操作均基于初始值(如2022-12-26)进行,该函数不会修改原变量的值,而是返回一个新的日期对象。
2.2.4、格式化日期
格式符号 | 符号的含义 |
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%M | 分钟数(00-59) |
%S | 秒(00-59) |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M.或P.M.的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为 0,星期一为 1,以此类推。 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |
%% | %号本身 |
datetime_2 = datetime.datetime.today()
print(datetime_2, type(datetime_2))
print(datetime.date.strftime(datetime_1, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
print(datetime.date.strftime(datetime_2, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
# 常用的格式: 年、月、日、时、分、秒
print(datetime.date.strftime(datetime_2, "%Y-%m-%d %H:%M:%S")) # 2022-07-08 18:32:40
2.3、ISO标准格式日期
- 格式规范为
(4位年-2位月-两位日),例如(2022,07,08)。
# 返回日期或者时间对象的ISO标准日期(4位年-2位月-两位日)
print(datetime.date.isoformat(datetime_1), datetime_1) # 2022-12-26 2022-12-26
print(datetime.date.isoformat(datetime_2), datetime_2) # 2022-07-08 2022-07-08 18:44:36.613676
# 将符合ISO标准格式的日期字符串转换为datetime.date对象
print(datetime.date.fromisoformat("2022-07-08"), type(datetime.date.fromisoformat("2022-07-08")))
# 不符合ISO标准格式的日期字符串则报错
# print(datetime.date.fromisoformat("2022-7-08")) # ValueError: Invalid isoformat string: '2022-7-08'
# print(datetime.date.fromisoformat("2022-07-8")) # ValueError: Invalid isoformat string: '2022-7-08'
2.3.1、获取符合ISO标准格式的日期字符串的星期几(1~7)
print(datetime.date.isoweekday(datetime.date(2022, 7, 3))) # 7 星期日
print(datetime.date.isoweekday(datetime.date(2022, 7, 4))) # 1 星期一
print(datetime.date.isoweekday(datetime.date(2022, 7, 8))) # 5 星期五
print(datetime.date.isoweekday(datetime.date(2022, 7, 9))) # 6 星期六
2.3.2、返回日期或者时间对象的星期几(0~6)
# 返回日期或者时间对象的星期几(0~6)
print(datetime.date.weekday(datetime.date(2022, 7, 3))) # 6 星期日
print(datetime.date.weekday(datetime.date(2022, 7, 4))) # 0 星期一
print(datetime.date.weekday(datetime.date(2022, 7, 8))) # 4 星期五
print(datetime.date.weekday(datetime.date(2022, 7, 9))) # 5 星期六
2.3.3、根据时间戳计算日期
print(datetime.date.fromtimestamp(2015236523)) # 2033-11-10
print(type(datetime.date.fromtimestamp(2015236523))) # <class 'datetime.date'>
2.3.4、ISO标准格式的时间元组
- 格式为
(年份, 周数, 星期数),例如(2022,26,7)。 - 周数表示一年中的第几周,取值范围为1至53。
- 星期数表示一周中的第几天,周一为第1天,周日为第7天。
# 获取符合ISO标准格式的时间元组
print(datetime.date.isocalendar(datetime.date(2022, 7, 3))) # datetime.IsoCalendarDate(year=2022, week=26, weekday=7)
# 根据符合ISO标准格式的时间元组(年份, 周数, 星期数)计算日期
print(datetime.date.fromisocalendar(2022, 26, 7)) # 2022-07-03
2.4、公元历格式日期
- 公元1年1月1日对应的序数为1。
print(datetime.date.fromordinal(1), type(datetime.date.fromordinal(1))) # 0001-01-01 <class 'datetime.date'>
print(datetime.date.fromordinal(5)) # 0001-01-05
print(datetime.date.fromordinal(738339)) # 2022-07-03
# 返回公元公历开始到现在的天数
print(datetime.date.toordinal(datetime.date(2022, 7, 3))) # 738339
3、其他
# 将 date类型转换为struct_time类型
print(datetime.date.timetuple(datetime.date(2022, 7, 3)))
# 日期类型的最大值
print(datetime.date.max)
# 日期类型的最小值
print(datetime.date.min)
附录:完整代码
# coding:utf-8
import datetime
# 日期对象类(date class)
"""
* 日期对象具有3个属性:年份、月份、日
* date()可以将指定的三个参数转化为datetime.date类的类型
* date()函数按位置传参必须是:年份、月份、日的顺序
"""
print(datetime.date(2022, 12, 26))
print(type(datetime.date(2022, 12, 26))) # <class 'datetime.date'>
# 下面的代码报错,缺少参数
# print(datetime.date(2022, 12)) # TypeError: function missing required argument 'day' (pos 3)
# 下面的代码提示值错误,date()函数的参数依次为 年份、月份、日;年份的范围是1-9999,月份的范围是1-12,日的范围是1-31
# print(datetime.date(10001, 12, 12)) # ValueError: year 10001 is out of range
# print(datetime.date(2022, 13, 12)) # ValueError: month must be in 1..12
# print(datetime.date(2022, 12, 32)) # ValueError: day is out of range for month
# 关键字传传参,只要保证年份、月份、天的值都在可用范围内,位置不受影响
print(datetime.date(day=15, year=2029, month=12))
# date类常用的函数
# 获取当期日期
print(datetime.date.today()) # 2022-07-08
print(type(datetime.date.today())) # <class 'datetime.date'>
# ctime()是将一个datetime.date对象转换为日期时间格式的字符串
print(datetime.date.ctime(datetime.date.today())) # Fri Jul 8 00:00:00 2022
print(type(datetime.date.ctime(datetime.date.today()))) # <class 'str'>
# ctime()函数的参数必须是 datetime.date类型
print(datetime.date.ctime(datetime.date(2022, 12, 26))) # Mon Dec 26 00:00:00 2022
# 创建一个 datetime.date对象
datetime_1 = datetime.date(2022, 12, 26)
# 获取日期对象的日,返回的值为int类型
print(datetime_1.day, type(datetime_1.day), type(datetime_1)) # 26 <class 'int'> <class 'datetime.date'>
# 获取日期对象的月,返回的值亦为int类型
print(datetime_1.month, type(datetime_1.month), type(datetime_1)) # 12 <class 'int'> <class 'datetime.date'>
# 获取日期对象的年,返回的值亦为int类型
print(datetime_1.year, type(datetime_1.year), type(datetime_1)) # 2022 <class 'int'> <class 'datetime.date'>
# 替换datetime.date对象的值
# replace(self, year=None, month=None, day=None) 函数具有一个必传参数,三个默认参数
# year是要替换的年度
# month是要替换的月份
# day是要替换的日
print(datetime.date.replace(datetime_1, year=2019, month=11, day=25)) # 2019-11-25
print(type(datetime.date.replace(datetime_1, year=2019, month=11, day=25))) # <class 'datetime.date'>
print(datetime_1)
# 必须有一个日期或者时间对象的参数,不传替换参数即返回传入的datetime.date对象的值
print(datetime.date.replace(datetime_1)) # 2022-12-26
# 只替换年度
print(datetime.date.replace(datetime_1, year=2019)) # 2019-12-26
# 只替换月份
print(datetime.date.replace(datetime_1, month=11)) # 2022-11-26
# 只替换日
print(datetime.date.replace(datetime_1, day=25)) # 2022-12-25
# 通过观察,替换年度、月份、日 都是在2022-12-26(datetime_1变量的初始值)基础上替换的。所以可以肯定的是该函数不会改变源变量的值
# 格式化日期
datetime_2 = datetime.datetime.today()
print(datetime_2, type(datetime_2))
print(datetime.date.strftime(datetime_1, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
print(datetime.date.strftime(datetime_2, "%Y--%y--%D--%d--%H--%h--%M--%m--%S--%A--%a--%B--%b--%C--%c"))
# 常用的格式: 年、月、日、时、分、秒
print(datetime.date.strftime(datetime_2, "%Y-%m-%d %H:%M:%S")) # 2022-07-08 18:32:40
# 返回日期或者时间对象的ISO标准日期(4位年-2位月-两位日)
print(datetime.date.isoformat(datetime_1), datetime_1) # 2022-12-26 2022-12-26
print(datetime.date.isoformat(datetime_2), datetime_2) # 2022-07-08 2022-07-08 18:44:36.613676
# 将符合ISO标准格式的日期字符串转换为datetime.date对象
print(datetime.date.fromisoformat("2022-07-08"), type(datetime.date.fromisoformat("2022-07-08")))
# 不符合ISO标准格式的日期字符串则报错
# print(datetime.date.fromisoformat("2022-7-08")) # ValueError: Invalid isoformat string: '2022-7-08'
# print(datetime.date.fromisoformat("2022-07-8")) # ValueError: Invalid isoformat string: '2022-7-08'
# 获取符合ISO标准格式的日期字符串的星期几(1~7)
print(datetime.date.isoweekday(datetime.date(2022, 7, 3))) # 7 星期日
print(datetime.date.isoweekday(datetime.date(2022, 7, 4))) # 1 星期一
print(datetime.date.isoweekday(datetime.date(2022, 7, 8))) # 5 星期五
print(datetime.date.isoweekday(datetime.date(2022, 7, 9))) # 6 星期六
# 返回日期或者时间对象的星期几(0~6)
print(datetime.date.weekday(datetime.date(2022, 7, 3))) # 6 星期日
print(datetime.date.weekday(datetime.date(2022, 7, 4))) # 0 星期一
print(datetime.date.weekday(datetime.date(2022, 7, 8))) # 4 星期五
print(datetime.date.weekday(datetime.date(2022, 7, 9))) # 5 星期六
# 根据时间戳计算日期
print(datetime.date.fromtimestamp(2015236523)) # 2033-11-10
print(type(datetime.date.fromtimestamp(2015236523))) # <class 'datetime.date'>
# 获取符合ISO标准格式的时间元组(年份, 周数, 星期数)
# 周数:一年中的第几周,范围是1~53
# 星期数:星期中的第几天,周一为第1天,周日为第7天
print(datetime.date.isocalendar(datetime.date(2022, 7, 3))) # datetime.IsoCalendarDate(year=2022, week=26, weekday=7)
# 根据符合ISO标准格式的时间元组(年份, 周数, 星期数)计算日期
print(datetime.date.fromisocalendar(2022, 26, 7)) # 2022 -07-03
# 将整形按公元历转换为日期
# * 公元1年1月1日为1
print(datetime.date.fromordinal(1), type(datetime.date.fromordinal(1))) # 0001-01-01 <class 'datetime.date'>
print(datetime.date.fromordinal(5)) # 0001-01-05
print(datetime.date.fromordinal(738339)) # 2022-07-03
# 返回公元公历开始到现在的天数
print(datetime.date.toordinal(datetime.date(2022, 7, 3))) # 738339
# 将 date类型转换为struct_time类型
print(datetime.date.timetuple(datetime.date(2022, 7, 3)))
# 日期类型的最大值
print(datetime.date.max)
# 日期类型的最小值
print(datetime.date.min)到此这篇关于Python标准库datetime date模块的详细介绍的文章就介绍到这了,更多相关Python date模块 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









