09-扩展知识——07. datetime 类 - 处理日期时间
2026/5/10 11:39:57 网站建设 项目流程

07. datetime 类 - 处理日期时间

概述

datetime类是 datetime 模块中最核心的类,它结合了datetime的功能,能够同时处理日期时间,是日常开发中最常用的时间处理类。

维度内容
What处理日期和时间(年、月、日、时、分、秒、微秒)
Why最全面的日期时间处理,包含 date + time 的所有功能
When时间戳、日志、订单时间、数据库存储
Wherefrom datetime import datetime
Who所有需要处理日期时间的开发者
Howdt = datetime(2026, 4, 19, 14, 30, 15)

1. datetime 类基础

1.1 创建 datetime 对象

fromdatetimeimportdatetime,date,timeimporttimeastm# 方式1:直接指定年月日时分秒dt1=datetime(2026,4,19,14,30,15,500000)print(dt1)# 2026-04-19 14:30:15.500000# 方式2:只指定年月日(时分秒默认为0)dt2=datetime(2026,4,19)print(dt2)# 2026-04-19 00:00:00# 方式3:获取当前时间now=datetime.now()print(now)# 2026-04-19 09:30:00.123456# 方式4:获取 UTC 时间utc_now=datetime.now(datetime.UTC)# Python 3.11+ 推荐print(utc_now)# 2026-04-19 01:30:00.123456+00:00# 方式5:从时间戳创建timestamp=tm.time()dt3=datetime.fromtimestamp(timestamp)print(dt3)# 2026-04-19 09:30:00.123456# 方式6:组合 date 和 timed=date(2026,4,19)t=time(14,30,15)dt4=datetime.combine(d,t)print(dt4)# 2026-04-19 14:30:15# 方式7:从 ISO 格式字符串创建dt5=datetime.fromisoformat("2026-04-19T14:30:15.500000")print(dt5)# 2026-04-19 14:30:15.500000# 方式8:从字符串解析dt6=datetime.strptime("2026-04-19 14:30:15","%Y-%m-%d %H:%M:%S")print(dt6)# 2026-04-19 14:30:15

1.2 最小和最大日期时间

fromdatetimeimportdatetime# 最小日期时间(0001-01-01 00:00:00)min_dt=datetime.minprint(f"最小:{min_dt}")# 最大日期时间(9999-12-31 23:59:59.999999)max_dt=datetime.maxprint(f"最大:{max_dt}")# 分辨率(微秒)resolution=datetime.resolutionprint(f"分辨率:{resolution}")# 0:00:00.000001

2. datetime 属性

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15,500000)# 日期部分print(f"年份:{dt.year}")# 2026print(f"月份:{dt.month}")# 4print(f"日期:{dt.day}")# 19# 时间部分print(f"小时:{dt.hour}")# 14print(f"分钟:{dt.minute}")# 30print(f"秒:{dt.second}")# 15print(f"微秒:{dt.microsecond}")# 500000

3. datetime 实例方法

3.1 date() 和 time() - 提取日期和时间

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)# 提取日期部分print(f"日期:{dt.date()}")# 2026-04-19# 提取时间部分print(f"时间:{dt.time()}")# 14:30:15# 提取带时区的时间print(f"带时区时间:{dt.timetz()}")# 14:30:15(如果没有时区)

3.2 replace() - 替换部分字段

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)# 替换年份print(dt.replace(year=2027))# 2027-04-19 14:30:15# 替换月份print(dt.replace(month=12))# 2026-12-19 14:30:15# 替换小时print(dt.replace(hour=8))# 2026-04-19 08:30:15# 同时替换多个print(dt.replace(year=2025,month=1,day=1,hour=0,minute=0,second=0))# 2025-01-01 00:00:00

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

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)t=dt.timetuple()print(f"时间元组:{t}")# time.struct_time(tm_year=2026, tm_mon=4, tm_mday=19, tm_hour=14, tm_min=30, tm_sec=15, tm_wday=6, tm_yday=109, tm_isdst=-1)

3.4 timestamp() - 转换为时间戳

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)timestamp=dt.timestamp()print(f"时间戳:{timestamp}")

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

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)# 周日print(f"weekday():{dt.weekday()}")# 6(周一=0)print(f"isoweekday():{dt.isoweekday()}")# 7(周一=1)

3.6 isoformat() - ISO 格式字符串

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15,500000)print(dt.isoformat())# 2026-04-19T14:30:15.500000print(dt.isoformat(sep=" "))# 2026-04-19 14:30:15.500000# timespec 参数print(dt.isoformat(timespec="seconds"))# 2026-04-19T14:30:15print(dt.isoformat(timespec="minutes"))# 2026-04-19T14:30

3.7 ctime() - C 语言格式

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)print(dt.ctime())# Sun Apr 19 14:30:15 2026

3.8 strftime() - 自定义格式化

fromdatetimeimportdatetime dt=datetime(2026,4,19,14,30,15)print(dt.strftime("%Y-%m-%d %H:%M:%S"))# 2026-04-19 14:30:15print(dt.strftime("%Y年%m月%d日 %H时%M分%S秒"))# 2026年04月19日 14时30分15秒print(dt.strftime("%A"))# Sunday

4. datetime 类方法

4.1 today() - 获取当前日期(不包含时间)

fromdatetimeimportdatetime today=datetime.today()print(f"当前:{today}")# 等同于 datetime.now(),但没有时区支持

4.2 now() - 获取当前日期时间

fromdatetimeimportdatetime,timezone# 本地时间now=datetime.now()print(f"本地时间:{now}")# UTC 时间utc_now=datetime.now(timezone.utc)print(f"UTC 时间:{utc_now}")

4.3 utcnow() - 获取 UTC 时间(已废弃)

fromdatetimeimportdatetime# 注意:Python 3.12+ 已废弃,推荐使用 datetime.now(timezone.utc)utc_now=datetime.utcnow()print(f"UTC 时间:{utc_now}")

4.4 fromtimestamp() - 从时间戳创建

fromdatetimeimportdatetimeimporttime timestamp=time.time()dt=datetime.fromtimestamp(timestamp)print(dt)# 指定时区dt_utc=datetime.fromtimestamp(timestamp,tz=timezone.utc)print(dt_utc)

4.5 strptime() - 从字符串解析

fromdatetimeimportdatetime dt=datetime.strptime("2026-04-19 14:30:15","%Y-%m-%d %H:%M:%S")print(dt)# 2026-04-19 14:30:15

4.6 combine() - 组合 date 和 time

fromdatetimeimportdatetime,date,time d=date(2026,4,19)t=time(14,30,15)dt=datetime.combine(d,t)print(dt)# 2026-04-19 14:30:15

5. datetime 运算

5.1 加减运算

fromdatetimeimportdatetime,timedelta now=datetime(2026,4,19,9,30,0)# 加法future=now+timedelta(days=7,hours=3)past=now-timedelta(days=3,hours=2)print(f"现在:{now}")print(f"7天3小时后:{future}")print(f"3天2小时前:{past}")

5.2 差值计算

fromdatetimeimportdatetime start=datetime(2026,4,19,9,0,0)end=datetime(2026,4,19,17,30,0)diff=end-startprint(f"时间差:{diff}")# 8:30:00print(f"总秒数:{diff.total_seconds()}")# 30600.0

5.3 比较运算

fromdatetimeimportdatetime dt1=datetime(2026,4,19,9,0,0)dt2=datetime(2026,4,19,17,0,0)print(f"dt1 < dt2:{dt1<dt2}")# Trueprint(f"dt1 > dt2:{dt1>dt2}")# Falseprint(f"dt1 == dt1:{dt1==dt1}")# True

6. 完整示例

fromdatetimeimportdatetime,timedelta,timezoneprint("="*50)print("datetime 类综合示例")print("="*50)# 1. 创建 datetime 对象print("\n1. 创建 datetime 对象")dt1=datetime(2026,4,19,14,30,15)dt2=datetime.now()dt3=datetime.fromtimestamp(1745030000)print(f"指定:{dt1}")print(f"当前:{dt2}")print(f"从时间戳:{dt3}")# 2. 获取各部分print("\n2. 获取各部分")print(f"日期:{dt1.date()}")print(f"时间:{dt1.time()}")print(f"年:{dt1.year}, 月:{dt1.month}, 日:{dt1.day}")print(f"时:{dt1.hour}, 分:{dt1.minute}, 秒:{dt1.second}")print(f"星期:{dt1.strftime('%A')}")# 3. 时间运算print("\n3. 时间运算")now=datetime.now()tomorrow=now+timedelta(days=1)next_week=now+timedelta(weeks=1)last_hour=now-timedelta(hours=1)print(f"现在:{now}")print(f"明天:{tomorrow}")print(f"下周:{next_week}")print(f"一小时前:{last_hour}")# 4. 时间差print("\n4. 时间差")start=datetime(2026,4,19,9,0,0)end=datetime(2026,4,19,17,30,0)diff=end-startprint(f"工作时长:{diff}")print(f"总分钟:{diff.total_seconds()/60:.0f}分钟")# 5. 格式化print("\n5. 格式化")print(f"ISO:{now.isoformat()}")print(f"中文:{now.strftime('%Y年%m月%d日 %H时%M分%S秒')}")print(f"日志:{now.strftime('%Y-%m-%d %H:%M:%S')}")print(f"文件名:{now.strftime('%Y%m%d_%H%M%S')}")# 6. 时区print("\n6. 时区")utc_now=datetime.now(timezone.utc)local_now=datetime.now()print(f"UTC:{utc_now}")print(f"本地:{local_now}")print(f"时差:{(local_now-utc_now.replace(tzinfo=None)).total_seconds()/3600:.0f}小时")

7. 常见陷阱

陷阱说明解决方案
naive vs aware无时区和有时区不能直接比较统一转换为 aware
utcnow() 废弃Python 3.12+ 已废弃使用datetime.now(timezone.utc)
时区转换astimezone()需要 aware 对象先用replace(tzinfo=...)localize()
微秒精度数据库可能不支持微秒使用replace(microsecond=0)

8. 总结

方法/属性用途
datetime(year, month, day, hour, minute, second, microsecond)创建对象
datetime.now()获取当前时间
datetime.strptime()字符串解析
datetime.combine()组合 date 和 time
dt.strftime()格式化输出
dt.date()/dt.time()提取日期/时间
dt.timestamp()转换为时间戳
dt + timedelta时间加减
dt1 - dt2时间差

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询