Android开发中如何判断两个Java Date是否为同一天以筛选销售报表
问题解决:Android判断两个日期是否为同一天
核心错误原因
- Java中字符串内容比对不能用
==,==对比的是两个字符串对象的内存地址,不是内容值,所以即使两个字符串格式内容完全一致,也会返回false,应该用equals()方法比对内容 - 用SimpleDateFormat转字符串比对的方式效率较低,还可能存在时区不一致导致的比对错误问题
修复方案
方案1:快速修复现有代码
直接修改字符串比对逻辑即可生效:
private void dateListArray() { dateList.clear(); // 每次筛选前清空旧数据,避免重复累加 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy"); String currDate = simpleDateFormat.format(calendar.getTimeInMillis()); for (ProductModel p : myDatabase.getAllReport()) { String dates = simpleDateFormat.format(new Date(p.getDate())); // 替换为equals比对字符串内容,加空判断避免空指针崩溃 if (currDate != null && currDate.equals(dates)){ dateList.add(p); } } adapter.setFilter(dateList); }
方案2:更高效的时间戳比对(推荐)
不用转字符串,直接计算选中日期的开始和结束时间戳,判断数据库存储的时间戳是否在这个区间内,性能更高、准确性更强:
private void dateListArray() { dateList.clear(); // 选中日期的开始时间:00:00:00.000 Calendar selectCalendar = Calendar.getInstance(); selectCalendar.setTime(calendar.getTime()); selectCalendar.set(Calendar.HOUR_OF_DAY, 0); selectCalendar.set(Calendar.MINUTE, 0); selectCalendar.set(Calendar.SECOND, 0); selectCalendar.set(Calendar.MILLISECOND, 0); long startTime = selectCalendar.getTimeInMillis(); // 选中日期的结束时间:23:59:59.999 selectCalendar.add(Calendar.DAY_OF_MONTH, 1); long endTime = selectCalendar.getTimeInMillis() - 1; for (ProductModel p : myDatabase.getAllReport()) { long productDate = p.getDate(); // 只要数据库存储的时间戳在选中日期的起止区间内,就是同一天 if (productDate >= startTime && productDate <= endTime) { dateList.add(p); } } adapter.setFilter(dateList); }
额外优化建议
可以直接在SQLite查询时就过滤对应日期的数据,不用先查全量再遍历过滤,数据量大的时候性能提升明显,SQL语句可以写SELECT * FROM 表名 WHERE date >= ? AND date <= ?,把上面算的startTime和endTime作为参数传入即可。
内容的提问来源于stack exchange,提问作者sadik
相关产品推荐
相关产品推荐

