当前位置: 首页 > news >正文

09-扩展知识——05. date 类 - 处理日期

05. date 类 - 处理日期

概述

date类是 datetime 模块中专门处理日期(年、月、日)的类,不包含时间和时区信息。它是日常日期操作中最常用的类之一。

维度内容
What处理日期(年、月、日)的类
Why专门处理日历日期,不关心具体时间
When生日、节假日、日期范围、日历计算
Wherefrom datetime import date
Who需要处理日期而非时间的开发者
Howd = date(2026, 4, 19)

1. date 类基础

1.1 创建 date 对象

fromdatetimeimportdateimporttime# 方式1:直接指定年月日d1=date(2026,4,19)print(d1)# 2026-04-19# 方式2:获取当前日期today=date.today()print(today)# 2026-04-19# 方式3:从时间戳创建timestamp=time.time()d2=date.fromtimestamp(timestamp)print(d2)# 2026-04-19# 方式4:从 ISO 格式字符串创建(Python 3.7+)d3=date.fromisoformat("2026-04-19")print(d3)# 2026-04-19# 方式5:从序数创建(公元1年1月1日为1)d4=date.fromordinal(738264)print(d4)# 2026-04-19

1.2 最小和最大日期

fromdatetimeimportdate# 最小日期(year=1, month=1, day=1)min_date=date.minprint(f"最小日期:{min_date}")# 0001-01-01# 最大日期(year=9999, month=12, day=31)max_date=date.maxprint(f"最大日期:{max_date}")# 9999-12-31# 最小时间间隔resolution=date.resolutionprint(f"分辨率:{resolution}")# 1 day, 0:00:00

2. date 属性

fromdatetimeimportdate d=date(2026,4,19)print(f"年份:{d.year}")# 2026print(f"月份:{d.month}")# 4print(f"日期:{d.day}")# 19

3. date 实例方法

3.1 replace() - 替换部分字段

fromdatetimeimportdate d=date(2026,4,19)# 替换年份print(d.replace(year=2027))# 2027-04-19# 替换月份print(d.replace(month=12))# 2026-12-19# 替换日期print(d.replace(day=1))# 2026-04-01# 同时替换多个print(d.replace(year=2025,month=5,day=10))# 2025-05-10

3.2 timetuple() - 转换为时间元组

fromdatetimeimportdate d=date(2026,4,19)t=d.timetuple()print(f"时间元组:{t}")# time.struct_time(tm_year=2026, tm_mon=4, tm_mday=19, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=109, tm_isdst=-1)print(f"年:{t.tm_year}")print(f"月:{t.tm_mon}")print(f"日:{t.tm_mday}")print(f"星期(0=周一):{t.tm_wday}")print(f"年中的第几天:{t.tm_yday}")

3.3 toordinal() - 转换为序数

fromdatetimeimportdate d=date(2026,4,19)ordinal=d.toordinal()print(f"序数:{ordinal}")# 从公元1年1月1日开始的天数# 从序数恢复d2=date.fromordinal(ordinal)print(f"恢复:{d2}")# 2026-04-19

3.4 weekday() 和 isoweekday() - 获取星期

fromdatetimeimportdate d=date(2026,4,19)# 周日# weekday(): 周一=0, 周日=6print(f"weekday():{d.weekday()}")# 6# isoweekday(): 周一=1, 周日=7print(f"isoweekday():{d.isoweekday()}")# 7# 获取星期名称weekdays=["周一","周二","周三","周四","周五","周六","周日"]print(f"星期:{weekdays[d.weekday()]}")

3.5 isoformat() - ISO 格式字符串

fromdatetimeimportdate d=date(2026,4,19)print(d.isoformat())# 2026-04-19

3.6 ctime() - C 语言格式字符串

fromdatetimeimportdate d=date(2026,4,19)print(d.ctime())# Sun Apr 19 00:00:00 2026

3.7 strftime() - 自定义格式化

fromdatetimeimportdate d=date(2026,4,19)print(d.strftime("%Y年%m月%d日"))# 2026年04月19日print(d.strftime("%Y-%m-%d"))# 2026-04-19print(d.strftime("%Y/%m/%d"))# 2026/04/19print(d.strftime("%d-%m-%Y"))# 19-04-2026print(d.strftime("%b %d, %Y"))# Apr 19, 2026print(d.strftime("%A"))# Sunday

4. date 类方法

4.1 today() - 获取当前日期

fromdatetimeimportdate today=date.today()print(f"今天:{today}")

4.2 fromtimestamp() - 从时间戳创建

fromdatetimeimportdateimporttime timestamp=time.time()d=date.fromtimestamp(timestamp)print(d)

4.3 fromisoformat() - 从 ISO 字符串创建

fromdatetimeimportdate d=date.fromisoformat("2026-04-19")print(d)# 2026-04-19

4.4 fromordinal() - 从序数创建

fromdatetimeimportdate# 公元1年1月1日是第1天d=date.fromordinal(1)print(d)# 0001-01-01

5. date 运算

5.1 日期加减

fromdatetimeimportdate,timedelta today=date(2026,4,19)# 加法tomorrow=today+timedelta(days=1)yesterday=today-timedelta(days=1)next_week=today+timedelta(weeks=1)last_month=today-timedelta(days=30)print(f"今天:{today}")print(f"明天:{tomorrow}")print(f"昨天:{yesterday}")print(f"下周:{next_week}")print(f"30天前:{last_month}")

5.2 日期差值

fromdatetimeimportdate start=date(2026,1,1)end=date(2026,12,31)diff=end-startprint(f"天数差:{diff.days}")# 364

5.3 日期比较

fromdatetimeimportdate d1=date(2026,4,19)d2=date(2026,4,20)d3=date(2026,4,19)print(f"d1 < d2:{d1<d2}")# Trueprint(f"d1 > d2:{d1>d2}")# Falseprint(f"d1 == d3:{d1==d3}")# True

6. 实用示例

6.1 判断闰年

fromdatetimeimportdatedefis_leap_year(year):"""判断是否为闰年"""returnyear%4==0and(year%100!=0oryear%400==0)# 测试years=[2024,2025,2026,2100,2400]foryinyears:print(f"{y}年是闰年:{is_leap_year(y)}")

6.2 获取月份天数

fromdatetimeimportdatefromcalendarimportmonthrangedefget_month_days(year,month):"""获取月份的天数"""returnmonthrange(year,month)[1]print(f"2026年4月有{get_month_days(2026,4)}天")

6.3 日期范围遍历

fromdatetimeimportdate,timedelta start=date(2026,4,1)end=date(2026,4,7)current=startwhilecurrent<=end:print(current.strftime("%Y-%m-%d %A"))current+=timedelta(days=1)

6.4 计算两个日期之间的天数

fromdatetimeimportdatedefdays_between(d1,d2):"""计算两个日期之间的天数(绝对值)"""returnabs((d2-d1).days)start=date(2026,1,1)end=date(2026,12,31)print(f"2026年天数:{days_between(start,end)}")# 364

6.5 获取本月第一天和最后一天

fromdatetimeimportdatefromcalendarimportmonthrangedefget_month_first_last(year,month):"""获取月份的第一天和最后一天"""first_day=date(year,month,1)last_day=date(year,month,monthrange(year,month)[1])returnfirst_day,last_day first,last=get_month_first_last(2026,4)print(f"4月第一天:{first}")print(f"4月最后一天:{last}")

6.6 计算年龄

fromdatetimeimportdatedefcalculate_age(birth_date):"""计算年龄"""today=date.today()age=today.year-birth_date.year# 如果今年生日还没过,减1if(today.month,today.day)<(birth_date.month,birth_date.day):age-=1returnage birth=date(1990,5,15)print(f"年龄:{calculate_age(birth)}")

7. 完整示例

fromdatetimeimportdate,timedeltaprint("="*50)print("date 类综合示例")print("="*50)# 1. 创建日期对象print("\n1. 创建日期对象")d1=date(2026,4,19)d2=date.today()print(f"指定日期:{d1}")print(f"当前日期:{d2}")# 2. 日期信息print("\n2. 日期信息")print(f"年份:{d1.year}")print(f"月份:{d1.month}")print(f"日期:{d1.day}")print(f"星期:{d1.strftime('%A')}")print(f"年中第{d1.timetuple().tm_yday}天")# 3. 日期运算print("\n3. 日期运算")today=date.today()tomorrow=today+timedelta(days=1)yesterday=today-timedelta(days=1)next_week=today+timedelta(weeks=1)print(f"今天:{today}")print(f"明天:{tomorrow}")print(f"昨天:{yesterday}")print(f"下周:{next_week}")# 4. 日期格式化print("\n4. 日期格式化")print(f"ISO格式:{today.isoformat()}")print(f"中文格式:{today.strftime('%Y年%m月%d日')}")print(f"英文格式:{today.strftime('%b %d, %Y')}")# 5. 日期比较print("\n5. 日期比较")d1=date(2026,4,19)d2=date(2026,5,1)print(f"{d1}<{d2}:{d1<d2}")print(f"{d1}>{d2}:{d1>d2}")print(f"相差天数:{(d2-d1).days}天")# 6. 实用功能print("\n6. 实用功能")birth=date(1990,4,19)age=calculate_age(birth)print(f"生日:{birth}")print(f"年龄:{age}岁")# 判断是否闰年year=2024print(f"{year}年是闰年:{year%4==0and(year%100!=0oryear%400==0)}")

8. 常见陷阱

陷阱说明解决方案
无效日期date(2026, 2, 29)会报错使用monthrange检查
月份范围月份必须是 1-12验证输入
日期范围日期必须在有效范围内验证输入
时区忽略date 不包含时区信息使用 datetime 处理时区

9. 总结

方法/属性用途
date(year, month, day)创建日期对象
date.today()获取当前日期
year,month,day获取年月日
weekday()获取星期(0=周一)
isoweekday()获取星期(1=周一)
replace()替换部分字段
strftime()格式化输出
+/- timedelta日期加减
date1 - date2日期差值

http://www.jsqmd.com/news/786340/

相关文章:

  • 基于Kubernetes的AI应用控制平面:kiro-acp架构解析与实践指南
  • Bean 会被 JVM 回收吗?
  • Animal-AI环境:连接强化学习与认知科学的3D虚拟实验室
  • 网络安全工程师超详细职业规划!零基础从入门到精通全程路线,看这一篇就够了
  • 收藏!2026年转AI大模型应用开发,正确学习顺序别踩坑(小白/程序员必看)
  • Undertow高性能Web服务器:架构解析与Java微服务实战
  • 医学影像分割:2D超图像与3D网络性能对比与选型指南
  • AI编程助手本地化提速:钩子拦截模式实现零延迟命令执行
  • Clawd-Code:基于LLM与代码库构建智能开发Agent的开源框架
  • CANN/cann-learning-hub:算子Kernel直调编程
  • 收藏必看!2026年AI内卷混战风口拆解,小白也能轻松入局大模型
  • OpenClaw本地AI智能体部署指南:从Docker到多平台实战
  • SSD主控架构到工业存储落地:天硕自研主控技术路径参照
  • 2026年国内GEO公司综合实力前五强榜单推荐:主流头部GEO服务商实力全解析 - GEO优化
  • 2026 年广州 GEO 服务商综合实力五强榜单与实战选型指南 - GEO优化
  • 容器是怎么管理 Bean 的?
  • 2026年近期大庆企业如何选择专业可靠的短视频服务伙伴? - 2026年企业推荐榜
  • 云原生性能测试平台OpenClaw Cloud:架构解析与实战部署指南
  • 第四篇:RDB与AOF持久化——宕机后数据怎么恢复?
  • 2026年最新趋势:西安外贸企业如何选择建站服务商突围海外市场? - 2026年企业推荐榜
  • 认知科学视角下的AGI评测:超越传统基准的多维能力评估框架
  • AI工作流引擎:构建可观测、可扩展的AI应用开发框架
  • 抖音直播录制神器:40+平台自动值守,永久保存精彩瞬间
  • 通用人工智能系统(GPAIS)的技术挑战与可信AI治理框架
  • AutoKG:大语言模型与远程监督驱动的自动化知识图谱构建实战
  • CANN/ascend-transformer-boost算子演示示例
  • GitHub中文界面终极指南:3步免费快速安装,告别英文困扰
  • Xbox成就解锁器完全指南:轻松解锁Xbox游戏成就的免费神器
  • CentOS 7 网卡没有 IP 地址的解决方法
  • AI系统设计实战指南:从RAG到Agentic Workflow的架构思维