You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:17:05