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

如何在Android Firebase数据库中按DateTime格式过滤键值范围数据?

Firebase实时数据库日期范围查询问题

我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:20:30