
本文详解 android 开发中基于时间戳筛选“最近一周完成图书”的常见错误与修复方案,重点解决因毫秒级精度不匹配导致的条件判断失效问题,并提供健壮、可复用的时间过滤实现。
本文详解 android 开发中基于时间戳筛选“最近一周完成图书”的常见错误与修复方案,重点解决因毫秒级精度不匹配导致的条件判断失效问题,并提供健壮、可复用的时间过滤实现。
在 Android 应用中,当需要根据完成时间(如 endDate)动态筛选“最近一周内完成的图书”时,一个典型且隐蔽的陷阱是时间戳单位不一致。从你的日志可见:
End Date: 1684159940 ← 仅 10 位数字(秒级 Unix 时间戳) One Week Ago Millis: 1683740684856 ← 13 位数字(毫秒级时间戳)
这说明 book.endDate 存储的是秒级时间戳(例如由 System.currentTimeMillis() / 1000 或后端返回的 JSON timestamp 字段生成),而 System.currentTimeMillis() 返回的是毫秒级时间戳。直接比较两者会导致 endDateMillis(约 16.8 亿)远小于 oneWeekAgoMillis(约 1.68 万亿),因此 if (endDateMillis >= oneWeekAgoMillis) 永远为 false,列表始终为空。
✅ 正确做法:统一单位为毫秒
将 book.endDate 乘以 1000 转换为毫秒后再参与比较:
private void lastWeekFilter(List<finishedbooks> finishedBooks) {
List<finishedbooks> lastWeekList = new ArrayList();
long currentTimeMillis = System.currentTimeMillis();
long oneWeekAgoMillis = currentTimeMillis - 7L * 24L * 60L * 60L * 1000L;
for (FinishedBooks book : finishedBooks) {
// ✅ 关键修复:将秒级 endDate 转为毫秒
long endDateMillis = book.endDate * 1000L;
if (endDateMillis >= oneWeekAgoMillis && endDateMillis <p>⚠️ 注意事项与最佳实践:</p>
<ul>
<li>
<strong>验证数据来源</strong>:检查 FinishedBooks.endDate 的赋值逻辑。若来自 new Date().getTime() / 1000 或服务端 {"endDate": 1684159940},则必为秒级;若来自 System.currentTimeMillis() 直接赋值,则为毫秒级。</li>
<li>
<strong>避免硬编码时间计算</strong>:推荐使用 Calendar 或更现代的 java.time(需 API ≥ 26 或使用 desugaring)提升可读性与时区鲁棒性:<pre class="brush:php;toolbar:false;">// 兼容旧版(API
总结:时间筛选失败的根源往往不是逻辑错误,而是单位混淆。始终确认时间戳单位(秒 vs 毫秒),并在比较前显式对齐——这是移动开发中高频踩坑点,也是保障时间敏感功能稳定性的关键细节。











