datetime.date叠加带时间timedelta时时间丢失如何构造正确datetime?
时间部分被忽略的原因
datetime.now().date()的返回值是datetime.date类型,该类型仅存储年、月、日三个字段,不承载任何时、分、秒、微秒的时间信息。date对象和timedelta做加法运算时,规则是仅提取timedelta里的天级偏移做计算,所有不足1天的时间单位(小时、分钟、秒等)都会被直接截断丢弃。你代码里写的timedelta(hours=14, minutes=23)换算成天约为0.6天,不足1天,计算时会被当作0天偏移直接忽略,最终自然只会返回加了1天的date对象,没有任何时间部分。
正确构造目标datetime对象的方案
根据你的需求(基于日期对象+固定时间14:23生成次日14:23的datetime),有两种常用的正确写法:
- 方案1:全程使用datetime类型做计算,避免提前截断时间信息
如果不需要先单独拿到date对象,可以直接在初始datetime上做偏移,再用replace固定到指定时间,避免时间累加误差:
from datetime import datetime, timedelta # 先拿到次日的datetime,再把时间部分固定为14:23:00,清零微秒 result = (datetime.now() + timedelta(days=1)).replace( hour=14, minute=23, second=0, microsecond=0 )
运行后就会得到你预期的datetime.datetime(2022, 6, 9, 14, 23)格式的结果。
- 方案2:如果已经拿到了date类型的日期对象,用
datetime.combine拼接时间
如果你的业务逻辑里已经先得到了date对象,可以用专门的组合方法把日期和固定时间拼成完整的datetime:
from datetime import datetime, timedelta, time # 先拿到次日的date对象 next_day = datetime.now().date() + timedelta(days=1) # 组合日期和固定时间14:23:00 result = datetime.combine(next_day, time(hour=14, minute=23))
注意:不要试图通过给date对象加小时、分钟级的timedelta来得到带时间的结果,这是date类型本身的设计限制,这类写法永远会丢失不足1天的时间偏移。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

