如何在Android Firebase数据库中按DateTime格式过滤键值范围数据?
Firebase实时数据库日期范围查询问题
我的Firebase数据库中日期存储形式如下:

我尝试用下面的Android Kotlin代码,从数据库中获取两个日期之间的数据,但没得到预期结果;移除endAt方法后代码能正常运行,可我需要同时限定起始和结束日期,求解决办法。
代码如下:
val startDateTime = LocalDateTime.parse("2022-10-26T14:00:00") val endDateTime = LocalDateTime.parse("2022-10-26T15:00:00") val dataResult = mDbRef.child("userLocations").child("hiN6EUn2ruZwqfqaDaboea4BoW62").child("WALKING_ENTER") .orderByChild("date") .startAt(startDateTime.toString()).endAt(endDateTime.toString())
问题原因
Firebase对字符串类型的日期是按字典序比较的,你数据库里的日期格式是dd-MM-yyyy HH:mm:ss,但代码里传入的是yyyy-MM-ddTHH:mm:ss格式的字符串,两种格式的字典排序逻辑和时间顺序完全不匹配,导致endAt条件无法正确过滤数据。
解决办法
方法1:推荐——统一用可排序的日期格式存储(ISO 8601或时间戳)
Firebase官方建议存储日期时使用ISO 8601格式(如2022-10-26T14:00:00)或者Unix时间戳(毫秒数),这类格式的字典序和时间顺序完全一致,查询逻辑会更可靠。
修改数据库中的日期格式后,你当前的代码就能正常工作。如果用时间戳,代码可以改成:
val startTimestamp = LocalDateTime.parse("2022-10-26T14:00:00").atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() val endTimestamp = LocalDateTime.parse("2022-10-26T15:00:00").atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() val dataResult = mDbRef.child("userLocations").child("hiN6EUn2ruZwqfqaDaboea4BoW62").child("WALKING_ENTER") .orderByChild("date") .startAt(startTimestamp) .endAt(endTimestamp)
方法2:转换代码中的日期格式匹配数据库
如果暂时不想修改数据库,就把代码里的起始、结束日期转换成和数据库一致的dd-MM-yyyy HH:mm:ss格式,再传入查询:
// 定义输入输出的日期格式 val inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss") val outputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss") val startDateTime = LocalDateTime.parse("2022-10-26T14:00:00", inputFormatter) val endDateTime = LocalDateTime.parse("2022-10-26T15:00:00", inputFormatter) // 转换成数据库对应的格式字符串 val startDateStr = startDateTime.format(outputFormatter) val endDateStr = endDateTime.format(outputFormatter) val dataResult = mDbRef.child("userLocations").child("hiN6EUn2ruZwqfqaDaboea4BoW62").child("WALKING_ENTER") .orderByChild("date") .startAt(startDateStr) .endAt(endDateStr)
额外注意
如果你的结束时间是15:00,endAt会包含数据库中刚好是15:00:00的记录;如果需要排除这个时间点,可以把结束日期设为2022-10-26 14:59:59,或者用时间戳的方式更精准地控制范围。
内容的提问来源于stack exchange,提问作者Prasanna
相关产品推荐
相关产品推荐

