一、time/datetime 模块是什么time和datetime是 Python 标准库中专门用于时间处理的核心模块无需额外安装直接导入即可使用二者分工互补覆盖了从底层时间操作到高级日期计算的所有时间处理场景。time模块偏底层实现基于 Unix 时间戳封装基础功能主打简单计时、延迟操作、时间戳与基础时间格式转换datetime模块面向对象的封装设计提供了date/time/datetime/timedelta等类主打复杂日期计算、灵活的时间格式转换、日期字段精准操作是实际开发中的首选。1.1 为什么需要它们表格场景解决方案获取当前时间戳 / 本地时间time.time()/datetime.now()程序计时 / 延迟执行time.time()计时 /time.sleep()延迟时间戳与字符串时间互转time.strftime()/datetime.strptime()日期加减 / 时间差计算datetime.timedelta()提取年 / 月 / 日 / 时等时间字段datetime对象直接属性访问1.2 快速上手python运行import time from datetime import datetime, timedelta # 查看模块所有功能 print(dir(time)) print(dir(datetime)) # 最简单的时间获取 print(当前时间戳, time.time()) print(当前本地时间, datetime.now())二、核心基础Unix 时间戳操作Unix 时间戳是 time/datetime 模块的底层核心是跨时区时间处理、时间计算的基础所有高级时间操作最终都可映射到时间戳的处理。2.1 基本用法python运行import time from datetime import datetime # 1. time模块获取时间戳float类型含微秒最常用 ts1 time.time() print(ftime模块获取{ts1}) # 示例1712000000.123456 # 2. datetime模块获取时间戳 ts2 datetime.timestamp(datetime.now()) print(fdatetime模块获取{ts2}) # 与ts1结果一致 # 3. 时间戳转整数忽略微秒适合数据库存储 ts_int int(time.time()) print(f整数时间戳{ts_int}) # 示例17120000002.2 时间戳转本地时间python运行import time from datetime import datetime ts 1712000000 # 1. time模块时间戳 → 结构化时间struct_time struct_time time.localtime(ts) print(f结构化时间{struct_time}) # 包含年、月、日等所有字段 # 提取结构化时间字段 print(f年份{struct_time.tm_year}小时{struct_time.tm_hour}) # 2. datetime模块时间戳 → datetime对象推荐操作更灵活 dt datetime.fromtimestamp(ts) print(fdatetime对象{dt}) # 示例2026-04-01 08:26:40 # 提取datetime对象字段 print(f年份{dt.year}小时{dt.hour})2.3 时间戳转 UTC 时间python运行import time from datetime import datetime ts 1712000000 # 1. time模块时间戳 → UTC结构化时间 utc_struct time.gmtime(ts) print(fUTC结构化时间{utc_struct}) # 2. datetime模块时间戳 → UTC datetime对象 utc_dt datetime.utcfromtimestamp(ts) print(fUTC datetime对象{utc_dt}) # 比本地时间晚8小时北京时间三、时间格式转换结构化 / 对象 → 字符串开发中常需要将计算机可识别的结构化时间 /.datetime 对象转换为人类易读的字符串时间如2026-04-01 10:30:00核心是掌握格式化符号。3.1 常用格式化符号必记表格符号含义示例%Y4 位年份2026%m2 位月份044 月%d2 位日期01%H24 小时制小时10上午 10 点/22晚上 10 点%M2 位分钟30%S2 位秒59%w星期0 周日1 周一2周二3.2 time 模块结构化时间 → 字符串python运行import time # 获取当前结构化时间 local_struct time.localtime() # 自定义格式转换 time_str1 time.strftime(%Y-%m-%d, local_struct) # 仅日期 time_str2 time.strftime(%Y-%m-%d %H:%M:%S, local_struct) # 日期时间 time_str3 time.strftime(%Y年%m月%d日 %H时%M分, local_struct) # 中文格式 print(time_str1, time_str2, time_str3) # 快捷获取默认格式字符串时间 default_str time.ctime() print(f默认格式{default_str}) # 示例Wed Apr 1 10:30:00 20263.3 datetime 模块datetime 对象 → 字符串推荐python运行from datetime import datetime # 获取当前datetime对象 now datetime.now() # 自定义格式转换直接调用对象方法更简洁 dt_str1 now.strftime(%Y-%m-%d) dt_str2 now.strftime(%Y-%m-%d %H:%M:%S) print(dt_str1, dt_str2) # 特殊格式ISO标准时间 iso_str now.isoformat() print(fISO格式{iso_str}) # 示例2026-04-01T10:30:00.123456四、时间格式转换字符串 → 结构化 / 对象开发中也常需要将用户输入、接口传参的字符串时间转换为计算机可处理的结构化时间 /datetime 对象核心要求格式化符号必须与字符串格式完全匹配。4.1 time 模块字符串 → 结构化时间python运行import time # 待转换字符串时间 time_str1 2026-04-01 10:30:00 time_str2 2026年04月01日 # 转换格式与字符串完全匹配 struct1 time.strptime(time_str1, %Y-%m-%d %H:%M:%S) struct2 time.strptime(time_str2, %Y年%m月%d日) print(f字符串转结构化时间1{struct1}) print(f字符串转结构化时间2{struct2}) # 结构化时间可再转时间戳 ts time.mktime(struct1) print(f转换为时间戳{ts})4.2 datetime 模块字符串 → datetime 对象推荐python运行from datetime import datetime # 待转换字符串时间 time_str 2026-04-01 10:30:00 # 转换格式与字符串完全匹配 dt datetime.strptime(time_str, %Y-%m-%d %H:%M:%S) print(f字符串转datetime对象{dt}) # 直接操作转换后的对象提取字段、计算 print(f提取月份{dt.month}) print(f提取星期{dt.weekday()}) # 0周一6周日与time模块的%w不同注意区分4.3 常见错误避坑python运行from datetime import datetime # 错误示例格式符号与字符串格式不匹配字符串是-格式是/ # dt datetime.strptime(2026-04-01, %Y/%m/%d) # 会抛出ValueError # 正确示例完全匹配 dt datetime.strptime(2026-04-01, %Y-%m-%d)五、高级日期计算timedelta 类datetime模块的timedelta类是处理日期加减、时间差计算的核心支持天、小时、分钟、秒等单位可直接与datetime对象进行算术运算是datetime模块优于time模块的核心特性。5.1 基本用法python运行from datetime import datetime, timedelta # 获取当前时间 now datetime.now() print(f当前时间{now.strftime(%Y-%m-%d %H:%M:%S)}) # 1. 创建时间差对象参数days, hours, minutes, seconds, microseconds delta1 timedelta(days1) # 1天 delta2 timedelta(hours2, minutes30) # 2小时30分钟 delta3 timedelta(days-1) # 负数值代表过去的时间 # 2. datetime对象 时间差 → 未来时间 tomorrow now delta1 next_time now delta2 print(f明天此时{tomorrow.strftime(%Y-%m-%d %H:%M:%S)}) print(f2小时30分钟后{next_time.strftime(%Y-%m-%d %H:%M:%S)}) # 3. datetime对象 - 时间差 → 过去时间 yesterday now delta3 # 等价于 now - timedelta(days1) half_hour_ago now - timedelta(minutes30) print(f昨天此时{yesterday.strftime(%Y-%m-%d %H:%M:%S)}) print(f30分钟前{half_hour_ago.strftime(%Y-%m-%d %H:%M:%S)})5.2 时间差计算python运行from datetime import datetime # 两个datetime对象相减 → 得到timedelta对象 dt1 datetime(2026, 4, 1, 10, 0, 0) dt2 datetime(2026, 4, 5, 12, 30, 0) diff dt2 - dt1 print(f时间差{diff}) # 示例4 days, 2:30:00 # 提取时间差的具体信息 print(f相差天数{diff.days}) print(f相差总秒数{diff.total_seconds()}) # 含小时、分钟、秒的总秒数 print(f相差秒数仅当天{diff.seconds}) # 不含天数范围0-863995.3 实战计算指定日期的前后 N 天python运行from datetime import datetime, timedelta def get_date_by_days(target_date_str, days): 计算指定日期的前后N天 :param target_date_str: 目标日期字符串格式%Y-%m-%d :param days: 偏移天数正数未来负数过去 :return: 偏移后的日期字符串 target_dt datetime.strptime(target_date_str, %Y-%m-%d) result_dt target_dt timedelta(daysdays) return result_dt.strftime(%Y-%m-%d) # 测试 print(get_date_by_days(2026-04-01, 7)) # 7天后2026-04-08 print(get_date_by_days(2026-04-01, -3)) # 3天前2026-03-29六、time 模块专属计时与延迟操作time模块在程序计时、主动延迟执行场景下更简洁高效是开发中高频使用的功能如测试代码执行效率、爬虫反爬延迟、定时等待等。6.1 程序精准计时python运行import time # 记录开始时间 start_ts time.time() # 模拟耗时操作如循环、数据处理、接口请求 total 0 for i in range(1000000): total i # 记录结束时间 end_ts time.time() # 计算执行耗时保留4位小数更精准 cost end_ts - start_ts print(f代码执行耗时{cost:.4f} 秒) print(f计算结果{total})6.2 程序延迟执行sleeppython运行import time print(程序开始执行...) # 延迟指定秒数支持小数如0.5500毫秒 time.sleep(2) # 休眠2秒 print(2秒后继续执行后续逻辑...) # 实战循环中延迟如爬虫每隔1秒请求一次 for i in range(3): print(f执行第{i1}次操作) time.sleep(1) # 每次操作间隔1秒6.3 高精度计时perf_counter对于微秒级高精度计时使用time.perf_counter()比time.time()更精准适合测试超短代码的执行效率。python运行import time start time.perf_counter() # 超短耗时操作 [i ** 2 for i in range(1000)] end time.perf_counter() print(f高精度计时耗时{end - start:.8f} 秒)七、专属类操作date /time 类datetime模块还提供了仅处理日期的date类和仅处理时间的time类适合场景单一的时间处理需求操作与datetime类一致更轻量。7.1 date 类仅处理年 / 月 / 日python运行from datetime import date, timedelta # 1. 获取当前日期 today date.today() print(f当前日期{today}) # 示例2026-04-01 # 2. 手动创建日期对象 custom_date date(2026, 4, 1) print(f自定义日期{custom_date}) # 3. 提取日期字段 print(f年{today.year}月{today.month}日{today.day}) # 4. 日期加减 tomorrow today timedelta(days1) print(f明天日期{tomorrow}) # 5. 日期格式转换 date_str today.strftime(%Y年%m月%d日) print(f日期转字符串{date_str}) # 字符串转日期 str2date date.fromisoformat(2026-04-01) print(f字符串转日期{str2date})7.2 time 类仅处理时 / 分 / 秒 / 微秒python运行from datetime import time, timedelta # 1. 手动创建时间对象时、分为必填秒、微秒可选 t1 time(10, 30, 0) t2 time(14, 20, 59, 123456) print(f时间1{t1}) # 10:30:00 print(f时间2{t2}) # 14:20:59.123456 # 2. 提取时间字段 print(f小时{t1.hour}分钟{t1.minute}秒{t1.second}) # 3. 时间格式转换 time_str t1.strftime(%H:%M:%S) print(f时间转字符串{time_str})八、时区处理基础与简易兼容Python 原生 time/datetime 模块对时区的支持较弱默认处理的是本地时间和UTC 时间开发中跨时区业务需注意时区转换以下是基础的时区兼容操作。8.1 本地时间与 UTC 时间互转python运行from datetime import datetime, timedelta # 1. 获取本地时间和UTC时间 local_now datetime.now() utc_now datetime.utcnow() print(f本地时间{local_now.strftime(%Y-%m-%d %H:%M:%S)}) print(fUTC时间{utc_now.strftime(%Y-%m-%d %H:%M:%S)}) # 2. UTC时间 → 北京时间UTC8 bj_now utc_now timedelta(hours8) print(fUTC转北京时间{bj_now.strftime(%Y-%m-%d %H:%M:%S)}) # 3. 本地时间 → UTC时间 local2utc local_now - timedelta(hours8) print(f本地时间转UTC{local2utc.strftime(%Y-%m-%d %H:%M:%S)})8.2 实战统一存储 UTC 时间推荐跨时区业务中数据库统一存储 UTC 时间展示层转换为本地时间是最佳实践避免时区混乱。python运行from datetime import datetime, timedelta # 1. 写入数据库存储UTC时间戳/UTC datetime utc_ts datetime.timestamp(datetime.utcnow()) print(f写入数据库的UTC时间戳{utc_ts}) # 2. 读取展示UTC时间戳 → 本地时间 local_dt datetime.fromtimestamp(utc_ts) print(f展示给用户的本地时间{local_dt.strftime(%Y-%m-%d %H:%M:%S)})8.3 第三方时区库pytz拓展原生模块功能有限复杂时区如夏令时、不同时区偏移推荐使用第三方库pytz需提前安装pip install pytz。python运行from datetime import datetime import pytz # 1. 获取指定时区的时间 bj_tz pytz.timezone(Asia/Shanghai) ny_tz pytz.timezone(America/New_York) bj_now datetime.now(bj_tz) ny_now datetime.now(ny_tz) print(f北京时间{bj_now.strftime(%Y-%m-%d %H:%M:%S)}) print(f纽约时间{ny_now.strftime(%Y-%m-%d %H:%M:%S)}) # 2. 时区转换 bj2ny bj_now.astimezone(ny_tz) print(f北京时间转纽约时间{bj2ny.strftime(%Y-%m-%d %H:%M:%S)})九、完整实战案例案例 1日志时间格式化工具开发中自定义日志需要将时间格式化为固定字符串包含毫秒提升日志可读性。python运行import time from datetime import datetime def get_log_time(with_msTrue): 获取日志专用时间字符串 :param with_ms: 是否包含毫秒 :return: 格式化时间字符串 if with_ms: # 包含毫秒%Y-%m-%d %H:%M:%S.%f%f为微秒取前3位为毫秒 return datetime.now().strftime(%Y-%m-%d %H:%M:%S.%f)[:-3] else: # 不包含毫秒 return datetime.now().strftime(%Y-%m-%d %H:%M:%S) # 测试使用 if __name__ __main__: print(f日志时间含毫秒{get_log_time()}) # 示例2026-04-01 10:30:00.123 print(f日志时间无毫秒{get_log_time(with_msFalse)}) # 示例2026-04-01 10:30:00 # 模拟日志输出 print(f[{get_log_time()}] 程序启动成功) print(f[{get_log_time()}] 执行数据处理操作)案例 2倒计时工具实现一个简单的倒计时功能指定目标时间实时输出剩余时间。python运行from datetime import datetime, timedelta import time def count_down(target_time_str): 倒计时功能 :param target_time_str: 目标时间字符串格式%Y-%m-%d %H:%M:%S target_dt datetime.strptime(target_time_str, %Y-%m-%d %H:%M:%S) print(f倒计时开始目标时间{target_time_str}) while True: now datetime.now() # 计算剩余时间 diff target_dt - now if diff.total_seconds() 0: print(倒计时结束) break # 提取剩余时、分、秒 hours diff.seconds // 3600 minutes (diff.seconds % 3600) // 60 seconds diff.seconds % 60 print(f剩余时间{hours:02d}:{minutes:02d}:{seconds:02d}, end\r) time.sleep(1) # 测试倒计时到2026-04-01 12:00:00 if __name__ __main__: count_down(2026-04-01 12:00:00)案例 3时间范围数据筛选根据指定的开始时间和结束时间筛选列表中符合时间范围的数据模拟数据库数据筛选。python运行from datetime import datetime # 模拟数据列表中每个元素包含id和create_time字符串格式 data_list [ {id: 1, create_time: 2026-04-01 09:00:00}, {id: 2, create_time: 2026-04-01 10:30:00}, {id: 3, create_time: 2026-04-01 11:00:00}, {id: 4, create_time: 2026-04-01 12:00:00}, {id: 5, create_time: 2026-04-01 13:00:00}, ] def filter_data_by_time(data, start_str, end_str): 按时间范围筛选数据 :param data: 原始数据列表 :param start_str: 开始时间字符串%Y-%m-%d %H:%M:%S :param end_str: 结束时间字符串%Y-%m-%d %H:%M:%S :return: 筛选后的列表 start_dt datetime.strptime(start_str, %Y-%m-%d %H:%M:%S) end_dt datetime.strptime(end_str, %Y-%m-%d %H:%M:%S) filtered [] for item in data: item_dt datetime.strptime(item[create_time], %Y-%m-%d %H:%M:%S) if start_dt item_dt end_dt: filtered.append(item) return filtered # 测试筛选2026-04-01 10:00:00 到 2026-04-01 12:00:00的数据 if __name__ __main__: result filter_data_by_time(data_list, 2026-04-01 10:00:00, 2026-04-01 12:00:00) print(筛选后的结果) for item in result: print(item)十、常见问题与避坑10.1 六大常见坑点表格坑点说明解决方案格式化符号不匹配字符串转时间时格式符号与字符串格式不一致抛出 ValueError严格保证格式符号与字符串的分隔符、位数完全匹配星期标识混淆time 模块 % w0 周日datetime.weekday ()0 周一记清两种星期的标识规则按需使用时区处理混乱直接将 UTC 时间作为本地时间展示导致时间偏差数据库统一存 UTC 时间展示层转换为本地时间sleep 传入非数字time.sleep () 传入字符串 / 其他类型抛出 TypeError确保 sleep 参数为 int/float 类型微秒处理忽略时间戳转字符串时忽略微秒导致精度丢失需高精度时使用 % f 格式化符号或保留原始时间戳日期计算用 time 模块用 time 模块做日期加减代码繁琐且易出错日期计算优先使用 datetime.timedelta 类10.2 最佳实践python运行from datetime import datetime, timedelta import time # 1. 安全的字符串转时间带异常捕获 def safe_str2dt(time_str, fmt%Y-%m-%d %H:%M:%S): try: return datetime.strptime(time_str, fmt) except ValueError: print(f时间格式错误要求格式{fmt}) return None # 2. 统一时间戳获取兼容Python所有版本 def get_uniq_ts(): return int(time.time() * 1000) # 毫秒级时间戳避免重复 # 3. 时间差计算友好展示 def get_friendly_diff(dt1, dt2): diff abs(dt1 - dt2) days diff.days hours diff.seconds // 3600 minutes (diff.seconds % 3600) // 60 seconds diff.seconds % 60 return f{days}天{hours}小时{minutes}分钟{seconds}秒 # 测试最佳实践 if __name__ __main__: print(safe_str2dt(2026-04-01 10:30:00)) print(f毫秒级时间戳{get_uniq_ts()}) print(get_friendly_diff(datetime(2026,4,1), datetime(2026,4,5,2,30)))十一、速查表11.1 常用函数 / 方法速查表格模块 / 类方法 / 函数用途示例timetime()获取当前时间戳time.time()timelocaltime(ts)时间戳转本地结构化时间time.localtime(1712000000)timestrftime(fmt, struct)结构化时间转字符串time.strftime(%Y-%m-%d, struct)timestrptime(str, fmt)字符串转结构化时间time.strptime(2026-04-01, %Y-%m-%d)timesleep(sec)程序延迟执行time.sleep(2)datetimenow()获取当前本地 datetime 对象datetime.now()datetimeutcnow()获取当前 UTC datetime 对象datetime.utcnow()datetimetimestamp(dt)datetime 对象转时间戳datetime.timestamp(dt)datetimefromtimestamp(ts)时间戳转 datetime 对象datetime.fromtimestamp(1712000000)datetimestrftime(fmt)datetime 对象转字符串dt.strftime(%Y-%m-%d %H:%M:%S)datetimestrptime(str, fmt)字符串转 datetime 对象datetime.strptime(str, fmt)timedeltatimedelta(days1)创建时间差对象timedelta(hours2, minutes30)datetoday()获取当前日期date.today()11.2 常用格式化符号速查表格符号含义示例%Y4 位年份2026%m2 位月份01-12%d2 位日期01-31%H24 小时制小时00-23%M2 位分钟00-59%S2 位秒00-59%f6 位微秒123456%w星期0 周日1 周一0-611.3 核心属性速查表格对象类型属性用途示例struct_timetm_year/tm_mon/tm_mday年 / 月 / 日struct.tm_yearstruct_timetm_hour/tm_min/tm_sec时 / 分 / 秒struct.tm_hourdatetime/dateyear/month/day年 / 月 / 日dt.yeardatetime/timehour/minute/second时 / 分 / 秒dt.hourtimedeltadays相差天数diff.daystimedeltatotal_seconds()相差总秒数diff.total_seconds()十二、总结核心要点time模块偏底层主打时间戳操作、计时、延迟适合简单的时间处理场景datetime模块面向对象主打日期计算、灵活的格式转换、字段提取通过timedelta实现便捷的日期加减是开发中的首选时间格式转换的核心是格式化符号字符串与格式必须完全匹配否则会抛出异常跨时区业务的最佳实践是数据库存储 UTC 时间展示层转换为本地时间复杂时区使用pytz库避免 90% 的时间处理 bug只需掌握时间戳的底层逻辑、格式化符号的正确使用、时区的基本转换。学习路径入门掌握时间戳获取、基础格式转换字符串↔时间对象、time.sleep()延迟进阶掌握timedelta日期计算、date/time类的使用、日志时间格式化精通掌握跨时区处理、高精度计时、时间范围筛选等实战场景能规避所有常见坑点。一句话总结time是 Python 时间处理的基础datetime是 Python 时间处理的利器二者结合能解决所有 Python 开发中的时间处理需求。