如何使用DatePickerDialog选择的日期查询Firestore的Timestamp数据
实现方案
可以仅通过日期选择器返回的日期完成Firestore带时间戳字段的文档查询,核心思路是构造选中日期的时间范围边界做范围查询即可。
具体实现步骤
- 首先修改
onDateSet中的代码,构造选中日期的起始和结束时间戳:
@Override public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { // 构造选中日期当天0点的Calendar实例 Calendar startCal = Calendar.getInstance(); startCal.set(Calendar.YEAR, year); startCal.set(Calendar.MONTH, month); startCal.set(Calendar.DATE, dayOfMonth); startCal.set(Calendar.HOUR_OF_DAY, 0); startCal.set(Calendar.MINUTE, 0); startCal.set(Calendar.SECOND, 0); startCal.set(Calendar.MILLISECOND, 0); // 转成Firestore的Timestamp Timestamp startTime = new Timestamp(startCal.getTime()); // 构造次日0点的Calendar实例,作为查询的上界 Calendar endCal = Calendar.getInstance(); endCal.setTime(startCal.getTime()); endCal.add(Calendar.DATE, 1); Timestamp endTime = new Timestamp(endCal.getTime()); // 执行Firestore查询 queryFirestoreByTimeRange(startTime, endTime); }
- 编写Firestore范围查询方法,以下示例假设你存储时间戳的字段名为
create_time:
private void queryFirestoreByTimeRange(Timestamp startTime, Timestamp endTime) { FirebaseFirestore db = FirebaseFirestore.getInstance(); // 替换为你自己的集合名 db.collection("你的集合名称") .whereGreaterThanOrEqualTo("create_time", startTime) .whereLessThan("create_time", endTime) .get() .addOnCompleteListener(task -> { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { // 处理查询到的文档逻辑 Log.d("QUERY_RESULT", document.getId() + " => " + document.getData()); } } else { Log.w("QUERY_ERROR", "查询文档出错", task.getException()); } }); }
原理解释
Firestore的Timestamp是精确到纳秒的时间值,我们把查询范围限定在选中日期的0点到次日0点前,就能匹配到当天任意时间点写入的、时间戳字段落在这个区间的所有文档,不需要额外处理时间部分的匹配。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

