Pythondatetime时间处理 Python datetime 时间处理datetime 提供日期/时间/时间差/时区处理的核心类。1. datetime / date / time / timedelta 基础-----------------------------------------------from datetime import datetime, date, time, timedelta# 获取当前时间now datetime.now() # 本地当前时间 (不含时区)utc_now datetime.utcnow() # UTC 当前时间 (不推荐, 无时区信息)print(当前时间:, now)print(当前日期:, now.date()) # 提取日期部分print(当前时间部分:, now.time()) # 提取时间部分# 构造特定日期时间dt datetime(2024, 12, 25, 10, 30, 0, 0)print(构造时间:, dt) # 2024-12-25 10:30:00# date / time 单独使用d date(2024, 6, 1)t time(14, 30, 15)print(日期:, d) # 2024-06-01print(时间:, t) # 14:30:15# timedelta: 时间加减now_plus_7d now timedelta(days7)print(7天后:, now_plus_7d)print(3小时前:, now - timedelta(hours3))print(时间差(天):, (now_plus_7d - now).days) # 7# timedelta 支持 weeks, days, hours, minutes, seconds, microseconds, millisecondsdelta timedelta(weeks1, days2, hours3)print(组合时间差总量(秒):, delta.total_seconds())2. 时区感知时间: zoneinfo (Python 3.9)--------------------------------------------from zoneinfo import ZoneInfo# zoneinfo 使用 IANA 时区数据库 (如 Asia/Shanghai, America/New_York)# 创建时区感知时间 (取代已弃用的 pytz)shanghai datetime(2024, 6, 1, 12, 0, tzinfoZoneInfo(Asia/Shanghai))print(上海时间:, shanghai)# 时区转换ny shanghai.astimezone(ZoneInfo(America/New_York))print(纽约时间:, ny)# UTC 时间的创建和转换utc_dt datetime(2024, 6, 1, 4, 0, tzinfoZoneInfo(UTC))tokyo utc_dt.astimezone(ZoneInfo(Asia/Tokyo))print(东京时间:, tokyo)# 获取当前时区感知时间 (推荐方式)now_utc datetime.now(ZoneInfo(UTC))now_shanghai datetime.now(ZoneInfo(Asia/Shanghai))print(UTC 现在:, now_utc)print(上海现在:, now_shanghai)3. strftime / strptime — 格式化与解析----------------------------------------from datetime import datetime# datetime - 字符串 (格式化)dt datetime(2024, 6, 1, 14, 30, 45)formats [%Y-%m-%d %H:%M:%S, # 2024-06-01 14:30:45%Y/%m/%d, # 2024/06/01%H:%M:%S, # 14:30:45%A, %B %d, %Y, # Saturday, June 01, 2024%I:%M %p, # 02:30 PM (12小时制)%j (一年中的第%d天), # 153 (一年中的第153天)%W (一年中的第%d周), # 22 (一年中的第22周)]for fmt in formats:print(f格式化 [{fmt}]: {dt.strftime(fmt)})# 字符串 - datetime (解析)date_str 2024-12-25 10:30:00parsed datetime.strptime(date_str, %Y-%m-%d %H:%M:%S)print(解析字符串:, parsed)# 常见格式代码:# %Y - 四位年份 %m - 两位月份 %d - 两位日期# %H - 24小时制 %I - 12小时制 %M - 分钟 %S - 秒# %p - AM/PM %A - 星期全名 %a - 星期缩写# %B - 月份全名 %b - 月份缩写 %j - 年中的第几天# %W - 年中的第几周 %w - 星期几 (0周日)4. dateutil.relativedelta — 月份/年份加减---------------------------------------------# pip install python-dateutilfrom dateutil.relativedelta import relativedeltafrom datetime import date# timedelta 不支持按月加减, relativedelta 弥补此缺陷d date(2024, 1, 31)print(加1个月:, d relativedelta(months1)) # 2024-02-29 (自动处理月末)print(减2个月:, d - relativedelta(months2)) # 2023-11-30print(加1年:, d relativedelta(years1)) # 2025-01-31# relativedelta 支持 years, months, weeks, days, hours, minutes, seconds# 以及更高级的参数: weekday, hour, minute, second, 等# 计算两个日期之间的差值 (月份维度)d1 date(2023, 1, 15)d2 date(2024, 6, 20)rd relativedelta(d2, d1)print(f相差 {rd.years} 年 {rd.months} 月 {rd.days} 天)# 计算下一个星期一from datetime import datefrom dateutil.relativedelta import relativedelta, MOtoday date(2024, 6, 1) # 星期六next_monday today relativedelta(weekdayMO(1)) # 下周一print(下一个周一:, next_monday) # 2024-06-03last_friday today relativedelta(weekdayFR(-1)) # 上周五 (需导入FR)# 注: MO, TU, WE, TH, FR, SA, SU 从 dateutil.rrule 导入5. 时区转换完整示例---------------------from datetime import datetimefrom zoneinfo import ZoneInfo# 场景: 将用户输入的本地时间转换为 UTC 存储def local_to_utc(local_str, local_zoneAsia/Shanghai):将本地时间的字符串表示转换为 UTC 时间naive datetime.strptime(local_str, %Y-%m-%d %H:%M:%S)local_tz ZoneInfo(local_zone)aware naive.replace(tzinfolocal_tz)return aware.astimezone(ZoneInfo(UTC))# 场景: 将 UTC 时间展示为目标时区def utc_to_local(utc_dt, target_zoneAmerica/New_York):将 UTC 时间转换为指定时区的本地时间if utc_dt.tzinfo is None:utc_dt utc_dt.replace(tzinfoZoneInfo(UTC))return utc_dt.astimezone(ZoneInfo(target_zone))user_input 2024-06-01 14:30:00utc_time local_to_utc(user_input)print(UTC 存储:, utc_time)ny_time utc_to_local(utc_time, America/New_York)print(纽约展示:, ny_time)# 检查时区相等性tz_sh1 ZoneInfo(Asia/Shanghai)tz_sh2 ZoneInfo(Asia/Shanghai)print(时区相等:, tz_sh1 tz_sh2) # True6. 工作日计算与营业日------------------------from datetime import date, timedeltadef is_weekend(d):判断是否为周末 (5周六, 6周日)return d.weekday() 5def next_business_day(d):获取下一个工作日d d timedelta(days1)while is_weekend(d):d timedelta(days1)return ddef business_days_between(start, end):计算两个日期之间的工作日数量days 0current startwhile current end:if not is_weekend(current):days 1current timedelta(days1)return daystoday date(2024, 6, 1) # 周六print(下一个工作日:, next_business_day(today)) # 2024-06-03 (周一)start date(2024, 6, 1)end date(2024, 6, 10)print(工作日天数:, business_days_between(start, end)) # 7天# Python 3.10 的 calendar 模块可用import calendarprint(2024年6月日历:)calendar.prmonth(2024, 6)7. ISO 8601 解析与时间戳转换--------------------------------from datetime import datetime, timezoneimport time# ISO 8601 字符串解析iso_str 2024-06-01T14:30:0008:00dt datetime.fromisoformat(iso_str) # Python 3.7 支持, 3.11 更全面print(ISO 解析:, dt)# 生成 ISO 8601now_utc datetime.now(timezone.utc)print(ISO 格式:, now_utc.isoformat()) # 2024-06-01T06:30:0000:00# 时间戳转换 (Unix 时间戳: 1970-01-01 UTC 起的秒数)ts time.time() # 当前时间戳 (float)print(当前时间戳:, ts)# 时间戳 - datetimedt_from_ts datetime.fromtimestamp(ts, tztimezone.utc)print(时间戳转UTC:, dt_from_ts)# datetime - 时间戳ts_from_dt dt_from_ts.timestamp()print(datetime 转回时间戳:, ts_from_dt)# 处理毫秒级时间戳 (常见于 Java/JavaScript)ms_timestamp 1717200000000 # 毫秒级时间戳dt_from_ms datetime.fromtimestamp(ms_timestamp / 1000, tztimezone.utc)print(毫秒时间戳转datetime:, dt_from_ms)总结: 现代 Python 开发应使用 zoneinfo (而非 pytz), 复杂日期计算用 dateutil.relativedelta, 时间存储统一用 UTC.