Firestore通过Timestamp字段查询文档失败,请求排查原因
Timestamp等值查询失败的原因及解决方案
问题根源:时区差异导致生成的Timestamp不一致
你的客户端和云函数看似用了相同的代码生成Timestamp,但两者运行时区不同,最终生成的时间戳完全不匹配:
- 客户端运行在用户本地时区(比如你例子里的UTC-5),
new Date(now.getFullYear(), now.getMonth(), now.getDate())生成的是本地时区的当天0点,对应UTC时间是October 7, 2024 at 5:00:00 AM UTC(UTC-5比UTC晚5小时)。 - 云函数默认运行在UTC时区,同样的代码生成的是UTC时区的当天0点,也就是你日志里的
_seconds: 1728345600,对应UTC时间是October 8, 2024 at 0:00:00 AM UTC,转换成UTC-5就是October 7, 2024 at 7:00:00 PM UTC-5——和客户端存储的Timestamp根本不是同一个时间,自然查不到数据。
解决方案:统一使用UTC时区生成Timestamp
不管是客户端还是云函数,都基于UTC时区构造"当天0点"的日期,确保两边生成的Timestamp一致:
客户端修改后的代码
constructor(){ const now = new Date() // 用UTC的年、月、日构造日期,确保生成UTC当天0点的Timestamp this.Date = Timestamp.fromDate(new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()))); }
云函数修改后的代码
const now = new Date() // 同样基于UTC时区构造日期 const ts: Timestamp = Timestamp.fromDate(new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()))) const finColRef = db.collection("users/" + mapKey + "/finance") const fQuerySnapshot = await finColRef.where("Date", "==", ts).get() fQuerySnapshot.forEach((doc: any) => { const data = doc.data() logger.log("fin data is::", data) });
直接验证:时间戳秒数对比
你可以手动核对两边的时间戳秒数,就能直观看到差异:
- 客户端存储的
October 7, 2024 at 12:00:00 AM UTC-5对应UTC时间2024-10-07T05:00:00Z,转换为秒数是1728259200。 - 云函数生成的
_seconds: 1728345600对应UTC时间2024-10-08T00:00:00Z,两者相差整整一天(86400秒),这就是查询失败的直接原因。
内容的提问来源于stack exchange,提问作者Moblize IT
相关产品推荐
相关产品推荐

