Android中FinishedBooks上周过滤逻辑未生效问题求助
解决时间戳单位不匹配导致的近一周图书过滤问题
核心问题是book.endDate为秒级时间戳,而System.currentTimeMillis()返回的是毫秒级时间戳,两者单位差1000倍,导致条件判断永远不成立。以下是几种直接的修复方式:
方法一:将秒级时间戳转为毫秒级
在过滤判断时,把book.endDate乘以1000,统一为毫秒级后再和时间范围对比:
// 计算近一周的毫秒级时间范围 long currentMillis = System.currentTimeMillis(); long oneWeekAgoMillis = currentMillis - 7 * 24 * 60 * 60 * 1000; // 遍历图书列表并过滤 for (FinishedBook book : allFinishedBooks) { long bookEndMillis = book.endDate * 1000; if (bookEndMillis >= oneWeekAgoMillis && bookEndMillis <= currentMillis) { lastWeekList.add(book); } }
方法二:将毫秒级时间戳转为秒级
反过来,把当前时间和一周前的时间转成秒级,直接和book.endDate比较:
// 转换为秒级时间戳 long currentSeconds = System.currentTimeMillis() / 1000; long oneWeekAgoSeconds = currentSeconds - 7 * 24 * 60 * 60; // 遍历图书列表并过滤 for (FinishedBook book : allFinishedBooks) { if (book.endDate >= oneWeekAgoSeconds && book.endDate <= currentSeconds) { lastWeekList.add(book); } }
额外优化建议
- 统一项目时间戳单位:后续存储和处理时间时,尽量固定使用毫秒级或秒级,避免再次出现单位混淆问题。
- 使用Java 8+时间API替代时间戳计算:借助
LocalDateTime、Instant等类,代码可读性更高,也能减少计算错误:
// 计算一周前的时间点 LocalDateTime oneWeekAgo = LocalDateTime.now().minusWeeks(1); // 将秒级时间戳转为LocalDateTime Instant bookEndInstant = Instant.ofEpochSecond(book.endDate); LocalDateTime bookEndTime = LocalDateTime.ofInstant(bookEndInstant, ZoneId.systemDefault()); // 判断是否在近一周内 if (!bookEndTime.isBefore(oneWeekAgo)) { lastWeekList.add(book); }
内容的提问来源于stack exchange,提问作者Muhammed Mustafa Geldi
相关产品推荐
相关产品推荐

