Firestore按日期查询Timestamp字段仅匹配相同时间如何解决
Firestore按日期忽略时间查询的实现方法
要实现仅匹配日期、忽略具体时间的查询,核心是使用时间范围查询替代精确匹配:Timestamp类型会存储精确到毫秒的时间,你之前的写法仅能匹配到2021-09-20 00:00:00这一精确时间点的记录,而范围查询可以覆盖当天所有时间段的记录。
实现逻辑
- 构造目标日期的起始时间:对应你需要的时区下,目标日期当天0点0分0秒的时间戳
- 构造目标日期的结束时间:起始时间加1天,即次日0点0分0秒的时间戳
- 组合两个范围查询条件:
dateStart >= 当日起始时间且dateStart < 次日起始时间
代码示例(JS SDK)
以你需求的UTC+1时区、查询2021年9月20日的记录为例:
// 构造UTC+1时区2021-09-20 00:00对应的UTC时间:2021-09-19 23:00:00 // 注意JS Date中月份从0开始计数,9月对应参数为8 const startOfDay = new Date(Date.UTC(2021, 8, 19, 23, 0, 0)); // 加1天得到次日0点,作为范围上限 const endOfDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000); refWallet .where("dateStart", ">=", startOfDay) .where("dateStart", "<", endOfDay) .get()
如果需要简化时区、日期计算,可以借助date-fns等日期工具库:
import { startOfDay, addDays } from 'date-fns' // 自动适配当前时区的当日起始时间 const todayStart = startOfDay(new Date()) const nextDayStart = addDays(todayStart, 1) refWallet .where("dateStart", ">=", todayStart) .where("dateStart", "<", nextDayStart) .get()
注意事项
- 构造起止时间时,要确保使用的时区和你写入
dateStart字段时的时区一致,避免出现查询结果偏移1天的问题 - 该查询为单字段范围查询,无需额外创建复合索引即可直接使用
内容的提问来源于stack exchange,提问作者Achraf
相关产品推荐
相关产品推荐

