如何用TypeScript结合Firestore查询匹配Date与Timestamp?
如何将Date类型日期与Firestore的Timestamp类型日期匹配查询?
我用日历组件返回的Date类型日期,需要和Firestore中存储为Timestamp类型的日期做查询匹配,但因为类型差异,即使日期相同,下面的TypeScript代码也无法找到对应文档,请问该怎么实现正确的查询?
async function getBaristaShift(date: Date, db: Firestore) { date.setHours(0, 0, 0, 0); const shiftsRef = collection(db, "shifts"); const queryStatement = query(shiftsRef, where("date", "==", date) } getBaristaShift(new Date(now), dbRef);
解决方案
问题核心在于Firestore的Timestamp类型和JavaScript原生Date类型底层存储逻辑不同,直接用Date做等于查询无法匹配存储的Timestamp字段。需要将Date转换为Firestore的Timestamp类型后再执行查询,同时推荐更稳妥的范围查询方式来覆盖当天所有记录:
- 转换类型匹配查询
将处理后的Date对象通过Timestamp.fromDate()方法转换为Firestore Timestamp,确保查询条件的类型与存储字段一致:
import { Timestamp, query, where, collection, getDocs } from "firebase/firestore"; async function getBaristaShift(date: Date, db: Firestore) { // 复制日期对象,避免修改原入参引发副作用 const targetDate = new Date(date); targetDate.setHours(0, 0, 0, 0); // 转换为Firestore Timestamp const targetTimestamp = Timestamp.fromDate(targetDate); const shiftsRef = collection(db, "shifts"); // 生成类型匹配的查询语句 const queryStatement = query(shiftsRef, where("date", "==", targetTimestamp)); // 执行查询并返回结果 const snapshot = await getDocs(queryStatement); return snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); } // 调用示例 getBaristaShift(new Date(), dbRef);
- 更稳妥的当天范围查询
如果Firestore中存储的date字段包含具体时分秒(而非仅当天0点),直接用等于查询会遗漏当天其他时间段的记录。此时建议使用范围查询,覆盖从当天0点到第二天0点的所有时间:
async function getBaristaShift(date: Date, db: Firestore) { const targetDate = new Date(date); targetDate.setHours(0, 0, 0, 0); const targetTimestamp = Timestamp.fromDate(targetDate); // 计算第二天0点的Timestamp const nextDay = new Date(targetDate); nextDay.setDate(nextDay.getDate() + 1); const nextDayTimestamp = Timestamp.fromDate(nextDay); const shiftsRef = collection(db, "shifts"); // 范围查询:>=当天0点 且 <第二天0点 const queryStatement = query( shiftsRef, where("date", ">=", targetTimestamp), where("date", "<", nextDayTimestamp) ); const snapshot = await getDocs(queryStatement); return snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); }
内容的提问来源于stack exchange,提问作者Marcos Garcia
相关产品推荐
相关产品推荐

