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
相关产品推荐
相关产品推荐

