Python time模块设置tm_hour等属性报只读错误如何解决
问题原因
timetuple() 方法返回的是 time.struct_time 类型的只读对象,它的所有属性(tm_hour/tm_min/tm_sec等)都不支持直接赋值,这就是触发AttributeError: readonly attribute报错的直接原因。
要计算剔除时分秒的日期差值,完全不需要手动修改时间字段,有两种更简单可靠的实现方式:
实现方法
方法1:直接提取日期对象(最简便)
datetime 对象自带的 date() 方法会直接返回只包含年、月、日信息的date对象,自动丢弃所有时分秒、微秒信息,两个date对象可以直接相减得到日期差:
from datetime import datetime # 示例:两个带时间的datetime对象 first_datetime = datetime(2024, 5, 1, 13, 45, 22) current_datetime = datetime(2024, 5, 10, 8, 12, 5) # 提取纯日期,自动剔除时间部分 first_date = first_datetime.date() current_date = current_datetime.date() # 计算差值,结果的days属性就是间隔天数 date_delta = current_date - first_date print(date_delta.days) # 输出 9
方法2:在datetime层面重置时分秒为0
如果你需要保留datetime类型(比如后续还要做时间相关运算),可以用replace()方法生成时分秒为0的新datetime对象,注意这个方法不会修改原对象,会返回修改后的新实例:
# 将时分秒、微秒全部置为0,得到当日0点的datetime对象 first_midnight = first_datetime.replace(hour=0, minute=0, second=0, microsecond=0) current_midnight = current_datetime.replace(hour=0, minute=0, second=0, microsecond=0) delta = current_midnight - first_midnight print(delta.days) # 输出 9
不要尝试修改
timetuple()返回的只读对象,这是Python标准库的设计规则,上述两种方法的执行效率和稳定性都远高于手动修改结构化时间字段。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

