使用epoch时间戳查询Core Data区间数据时结果不一致
问题原因
1. 谓词格式符使用错误,导致精度丢失
你在NSPredicate中使用了%f作为时间戳的占位符,%f在Core Data的解析逻辑中对应32位单精度浮点数,仅能保证约7位十进制有效数字。当前Unix时间戳已经是10位量级,用32位浮点数存储时,精度误差最大可达±64秒。
你示例中的记录1时间戳1631816962.0和endTimeStamp1631817000.0仅差38秒,被精度误差抹平了差距,甚至被判定为大于endTimeStamp,因此没有被查询返回。这也是问题只出现在23:59之后(时间戳接近当日end值)的核心原因。
2. 需确认时区计算逻辑
你所在时区为UTC+05:30,当地时间当日0点对应UTC前一天18:30,当地时间当日24点对应UTC当日18:30。请确认你计算startTimeStamp、endTimeStamp的逻辑确实覆盖了你需要的完整当日区间,避免时区偏移计算错误导致的区间截断。
解决方案
将谓词的格式符替换为适配64位浮点数的%lf,避免精度丢失:
let timeStampPredicate = NSPredicate(format: "timestamp >= %lf AND timestamp < %lf", startTimeStamp, endTimeStamp)
更稳妥的方案是将时间戳封装为NSNumber,用%@作为占位符,完全规避类型解析误差:
let timeStampPredicate = NSPredicate(format: "timestamp >= %@ AND timestamp < %@", NSNumber(value: startTimeStamp), NSNumber(value: endTimeStamp))
内容的提问来源于stack exchange,提问作者Nikhil Muskur
相关产品推荐
相关产品推荐

