如何通过DatePicker筛选Firestore Server Timestamp,仅匹配指定日期(忽略时区与时分秒)
如何筛选Firestore中指定日期的Server Timestamp数据
你的问题核心在于,Firestore的Server Timestamp是精确到纳秒的,而你用DatePicker生成的Timestamp包含了具体的时分秒(比如16:20:27),但Firestore中文档的date字段可能有不同的时分秒值,直接用whereEqualTo精确匹配自然找不到结果。要筛选同一天的数据,你需要查询该日期的时间范围——从当天00:00:00到次日00:00:00之间的所有数据。
步骤1:调整DatePicker的时间处理
在你的DatePicker回调中,把选中的日期调整为当天的起始时间(00:00:00),然后计算出次日的起始时间作为范围的结束点:
val datePicker = DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth -> calendar.set(Calendar.YEAR, year) calendar.set(Calendar.MONTH, month) calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth) // 设置为当天00:00:00,清零时分秒 calendar.set(Calendar.HOUR_OF_DAY, 0) calendar.set(Calendar.MINUTE, 0) calendar.set(Calendar.SECOND, 0) calendar.set(Calendar.MILLISECOND, 0) val startTimestamp = Timestamp(calendar.time) // 计算次日00:00:00作为结束时间 calendar.add(Calendar.DAY_OF_MONTH, 1) val endTimestamp = Timestamp(calendar.time) Log.d("start_time", "$startTimestamp") Log.d("end_time", "$endTimestamp") Firestore().filterOrderList(this, recyclerView, startTimestamp, endTimestamp) }
步骤2:修改Firestore筛选函数
更新你的filterOrderList函数,使用时间范围查询来替代精确匹配:
fun filterOrderList(activity: Fragment, recyclerView: RecyclerView, startTimestamp: Timestamp, endTimestamp: Timestamp) { mFirestore.collection(Constants.ORDERS) // 筛选大于等于当天起始时间的数据 .whereGreaterThanOrEqualTo("date", startTimestamp) // 筛选小于次日起始时间的数据(即不包含次日00:00:00及以后) .whereLessThan("date", endTimestamp) .get() .addOnSuccessListener { result -> Log.d("result_count", "找到${result.size()}条数据") val orderItem = result.toObjects(UserOrderList::class.java) recyclerView.adapter = OrderListItemAdapter(activity, activity.requireContext(), orderItem) } .addOnFailureListener { e -> Log.e("error", "查询失败: ${e.message}") } }
为什么这样有效?
startTimestamp是你选中日期的00:00:00,endTimestamp是第二天的00:00:00,这个范围刚好覆盖了选中日期的所有时间点(从00:00:00到23:59:59.999...)。- Firestore支持范围查询,并且会自动利用
date字段的索引(如果没有索引,控制台会提示你创建,直接点击链接即可生成)。
这样修改后,就能准确筛选出所有日期为12 Oct 2021的数据,完全忽略时分秒的差异。
内容的提问来源于stack exchange,提问作者Tea
相关产品推荐
相关产品推荐

