You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python计算AD账户密码时长遇TypeError:偏移感知与朴素时间无法相减

问题解决:时区感知与无时区时间对象相减错误

问题原因

你遇到的TypeError: can't subtract offset-naive and offset-aware datetimes,是因为datetime.now()生成的是**无时区信息(offset-naive)的时间对象,而从AD获取的pwdLastSet.value是带时区信息(offset-aware)**的时间对象,Python不允许这两种类型直接做减法运算。

修复方案

提供两种可行的修复方式,任选一种即可:

方式1:将当前时间转为带时区的对象

AD返回的pwdLastSet通常是UTC时区,直接生成UTC时区的当前时间,保证两者时区一致:

from datetime import datetime, timezone

# 保留原有循环和用户信息获取代码
current_date = datetime.now(timezone.utc)  # 生成带UTC时区的当前时间
start_date = user_details[0].pwdLastSet.value
if start_date == 0:
    password_age = 'NULL'
else:
    password_age = current_date - start_date

方式2:移除AD时间对象的时区信息

如果业务场景不需要保留时区信息,可以将带时区的时间对象转换为无时区对象:

from datetime import datetime

# 保留原有循环和用户信息获取代码
current_date = datetime.now()
start_date = user_details[0].pwdLastSet.value
if start_date == 0:
    password_age = 'NULL'
else:
    # 移除时区信息,转为无时区时间对象
    start_date_naive = start_date.replace(tzinfo=None)
    password_age = current_date - start_date_naive

额外优化建议

如果要将password_age插入PostgreSQL,建议用Python的None代替字符串'NULL',SQL驱动会自动将其转换为数据库的NULL值,避免语法错误:

if start_date == 0:
    password_age = None  # 用None替代字符串'NULL'
else:
    # 选择上述任意一种时间处理方式
    password_age = current_date - start_date

内容的提问来源于stack exchange,提问作者user19086677

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:40:25