Python标准库datetime之date模块详解
datetime是Python提供的操作日期和时间的标准库,主要有datetime.date模块、datetime.time模块及datetime.datetime模块。其中date模块提供了日期操作相关的方法;time模块提供了时间操作相关的方法;datetime提供了日期时间操作的相关内容。本文主要介绍datetime.date模块中常用函数的使用详情。
1、日期对象类
日期对象具有3个属性:年份、月份、日日期对象的创建使用date()定义date()可以将传入的参数转化为datetime.date类型date()函数按位置传参必须是:年份、月份、日date()函数的参数中年份的范围是1-9999,月份的范围是1-12,日的范围是1-311、定义
先导入datetime库再操作# coding:utf-8import datetimenow_date = datetime.date(, 12, 26)print(now_date)
1.2、常见错误
缺少参数按位置传参时参数值超出范围# coding:utf-8import datetimeprint(datetime.date(, 12, 26))print(type(datetime.date(, 12, 26))) # <class 'datetime.date'># 下面的代码报错,缺少参数# print(datetime.date(, 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(, 13, 12)) # ValueError: month must be in 1..12# print(datetime.date(, 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-8import datetimeprint(datetime.date.today()) # -07-08print(type(datetime.date.today())) # <class 'datetime.date'>
2.2、格式化日期
2.2.1、ctime()
将一个datetime.date对象转换为日期时间格式的字符串ctime()函数的参数必须是 datetime.date类型print(datetime.date.ctime(datetime.date.today())) # Fri Jul 8 00:00:00 print(type(datetime.date.ctime(datetime.date.today())))# <class 'str'># ctime()函数的参数必须是 datetime.date类型print(datetime.date.ctime(datetime.date(, 12, 26)))# Mon Dec 26 00:00:00
2.2.2、datetime.date对象
datetime_1 = datetime.date(, 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))# <class 'int'> <class 'datetime.date'>
2.2.3、replace(self, year=None, month=None, day=None)
替换datetime.date对象的值replace()函数具有一个必传参数,三个默认参数year是要替换的年度month是要替换的月份day是要替换的日datetime_1 = datetime.date(, 12, 26)print(datetime.date.replace(datetime_1, year=, month=11, day=25)) # -11-25print(type(datetime.date.replace(datetime_1, year=, month=11, day=25))) # <class 'datetime.date'>print(datetime_1)# 必须有一个日期或者时间对象的参数,不传替换参数即返回传入的datetime.date对象的值print(datetime.date.replace(datetime_1))# -12-26# 只替换年度print(datetime.date.replace(datetime_1, year=))# -12-26# 只替换月份print(datetime.date.replace(datetime_1, month=11))# -11-26# 只替换日print(datetime.date.replace(datetime_1, day=25)) # -12-25
通过观察,替换年度、月份、日 都是在-12-26(datetime_1变量的初始值)基础上替换的。所以可以肯定的是该函数不会改变原变量的值
2.2.4、格式化日期
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")) # -07-08 18:32:40
2.3、ISO标准格式日期
格式:(4位年-2位月-两位日)
,如(,07,08)
# 返回日期或者时间对象的ISO标准日期(4位年-2位月-两位日)print(datetime.date.isoformat(datetime_1), datetime_1) # -12-26 -12-26print(datetime.date.isoformat(datetime_2), datetime_2) # -07-08 -07-08 18:44:36.613676# 将符合ISO标准格式的日期字符串转换为datetime.date对象print(datetime.date.fromisoformat("-07-08"), type(datetime.date.fromisoformat("-07-08")))# 不符合ISO标准格式的日期字符串则报错# print(datetime.date.fromisoformat("-7-08"))# ValueError: Invalid isoformat string: '-7-08'# print(datetime.date.fromisoformat("-07-8"))# ValueError: Invalid isoformat string: '-7-08'
2.3.1、获取符合ISO标准格式的日期字符串的星期几(1~7)
print(datetime.date.isoweekday(datetime.date(, 7, 3)))# 7 星期日print(datetime.date.isoweekday(datetime.date(, 7, 4)))# 1 星期一print(datetime.date.isoweekday(datetime.date(, 7, 8)))# 5 星期五print(datetime.date.isoweekday(datetime.date(, 7, 9)))# 6 星期六
2.3.2、返回日期或者时间对象的星期几(0~6)
# 返回日期或者时间对象的星期几(0~6)print(datetime.date.weekday(datetime.date(, 7, 3))) # 6 星期日print(datetime.date.weekday(datetime.date(, 7, 4))) # 0 星期一print(datetime.date.weekday(datetime.date(, 7, 8))) # 4 星期五print(datetime.date.weekday(datetime.date(, 7, 9))) # 5 星期六
2.3.3、根据时间戳计算日期
print(datetime.date.fromtimestamp(236523))# 2033-11-10print(type(datetime.date.fromtimestamp(236523))) # <class 'datetime.date'>
2.3.4、ISO标准格式的时间元组
格式 :(年份, 周数, 星期数)
,如(,26,7)
周数:一年中的第几周,范围是1~53星期数:星期中的第几天,周一为第1天,周日为第7天# 获取符合ISO标准格式的时间元组print(datetime.date.isocalendar(datetime.date(, 7, 3))) # datetime.IsoCalendarDate(year=, week=26, weekday=7)# 根据符合ISO标准格式的时间元组(年份, 周数, 星期数)计算日期print(datetime.date.fromisocalendar(, 26, 7)) # -07-03
2.4、公元历格式日期
公元1年1月1日为1print(datetime.date.fromordinal(1), type(datetime.date.fromordinal(1)))# 0001-01-01 <class 'datetime.date'>print(datetime.date.fromordinal(5)) # 0001-01-05print(datetime.date.fromordinal(738339))# -07-03# 返回公元公历开始到现在的天数print(datetime.date.toordinal(datetime.date(, 7, 3))) # 738339
3、其他
# 将 date类型转换为struct_time类型print(datetime.date.timetuple(datetime.date(, 7, 3)))# 日期类型的最大值print(datetime.date.max)# 日期类型的最小值print(datetime.date.min)
附录:完整代码
# coding:utf-8import datetime# 日期对象类(date class)"""* 日期对象具有3个属性:年份、月份、日* date()可以将指定的三个参数转化为datetime.date类的类型* date()函数按位置传参必须是:年份、月份、日的顺序"""print(datetime.date(, 12, 26))print(type(datetime.date(, 12, 26))) # <class 'datetime.date'># 下面的代码报错,缺少参数# print(datetime.date(, 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(, 13, 12)) # ValueError: month must be in 1..12# print(datetime.date(, 12, 32)) # ValueError: day is out of range for month# 关键字传传参,只要保证年份、月份、天的值都在可用范围内,位置不受影响print(datetime.date(day=15, year=2029, month=12))# date类常用的函数# 获取当期日期print(datetime.date.today()) # -07-08print(type(datetime.date.today())) # <class 'datetime.date'># ctime()是将一个datetime.date对象转换为日期时间格式的字符串print(datetime.date.ctime(datetime.date.today())) # Fri Jul 8 00:00:00 print(type(datetime.date.ctime(datetime.date.today())))# <class 'str'># ctime()函数的参数必须是 datetime.date类型print(datetime.date.ctime(datetime.date(, 12, 26)))# Mon Dec 26 00:00:00 # 创建一个 datetime.date对象datetime_1 = datetime.date(, 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))# <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=, month=11, day=25)) # -11-25print(type(datetime.date.replace(datetime_1, year=, month=11, day=25))) # <class 'datetime.date'>print(datetime_1)# 必须有一个日期或者时间对象的参数,不传替换参数即返回传入的datetime.date对象的值print(datetime.date.replace(datetime_1))# -12-26# 只替换年度print(datetime.date.replace(datetime_1, year=))# -12-26# 只替换月份print(datetime.date.replace(datetime_1, month=11))# -11-26# 只替换日print(datetime.date.replace(datetime_1, day=25)) # -12-25# 通过观察,替换年度、月份、日 都是在-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")) # -07-08 18:32:40# 返回日期或者时间对象的ISO标准日期(4位年-2位月-两位日)print(datetime.date.isoformat(datetime_1), datetime_1) # -12-26 -12-26print(datetime.date.isoformat(datetime_2), datetime_2) # -07-08 -07-08 18:44:36.613676# 将符合ISO标准格式的日期字符串转换为datetime.date对象print(datetime.date.fromisoformat("-07-08"), type(datetime.date.fromisoformat("-07-08")))# 不符合ISO标准格式的日期字符串则报错# print(datetime.date.fromisoformat("-7-08"))# ValueError: Invalid isoformat string: '-7-08'# print(datetime.date.fromisoformat("-07-8"))# ValueError: Invalid isoformat string: '-7-08'# 获取符合ISO标准格式的日期字符串的星期几(1~7)print(datetime.date.isoweekday(datetime.date(, 7, 3)))# 7 星期日print(datetime.date.isoweekday(datetime.date(, 7, 4)))# 1 星期一print(datetime.date.isoweekday(datetime.date(, 7, 8)))# 5 星期五print(datetime.date.isoweekday(datetime.date(, 7, 9)))# 6 星期六# 返回日期或者时间对象的星期几(0~6)print(datetime.date.weekday(datetime.date(, 7, 3))) # 6 星期日print(datetime.date.weekday(datetime.date(, 7, 4))) # 0 星期一print(datetime.date.weekday(datetime.date(, 7, 8))) # 4 星期五print(datetime.date.weekday(datetime.date(, 7, 9))) # 5 星期六# 根据时间戳计算日期print(datetime.date.fromtimestamp(236523))# 2033-11-10print(type(datetime.date.fromtimestamp(236523))) # <class 'datetime.date'># 获取符合ISO标准格式的时间元组(年份, 周数, 星期数)# 周数:一年中的第几周,范围是1~53# 星期数:星期中的第几天,周一为第1天,周日为第7天print(datetime.date.isocalendar(datetime.date(, 7, 3))) # datetime.IsoCalendarDate(year=, week=26, weekday=7)# 根据符合ISO标准格式的时间元组(年份, 周数, 星期数)计算日期print(datetime.date.fromisocalendar(, 26, 7)) # -07-03# 将整形按公元历转换为日期# * 公元1年1月1日为1print(datetime.date.fromordinal(1), type(datetime.date.fromordinal(1)))# 0001-01-01 <class 'datetime.date'>print(datetime.date.fromordinal(5)) # 0001-01-05print(datetime.date.fromordinal(738339))# -07-03# 返回公元公历开始到现在的天数print(datetime.date.toordinal(datetime.date(, 7, 3))) # 738339# 将 date类型转换为struct_time类型print(datetime.date.timetuple(datetime.date(, 7, 3)))# 日期类型的最大值print(datetime.date.max)# 日期类型的最小值print(datetime.date.min)
如果觉得《Python标准库datetime之date模块详解》对你有帮助,请点赞、收藏,并留下你的观点哦!