AngularJS调用NodeJS接口查询Firestore因时区问题返回错误结果
问题解决方案
问题根源
Firestore 中存储的 firebaseAddDate 字段为 UTC 时区的 Timestamp 类型,你前端传入的是 UTC+5 的巴基斯坦标准时间,两端时区未对齐导致查询结果偏移5小时。另外原有代码存在逻辑判断语法错误,也可能影响查询结果。
修复步骤
1. 修正代码逻辑错误
原有查询条件判断if(! req.query.alert=='')存在运算符优先级问题,修正为:
if(req.query.alert !== ''){ ref = ref.where(req.query.alert,'==',true); }
2. 对齐时区使用 Timestamp 查询
直接用 Firestore 官方提供的 Timestamp 类型做查询,避免 Date 对象的隐式时区转换误差:
api.get('/getDoc', async function(req,res){ // 解析前端传入的时间字符串后转成Firestore Timestamp const start = admin.firestore.Timestamp.fromDate(new Date(req.query.fromDateData)); const end = admin.firestore.Timestamp.fromDate(new Date(req.query.toDateData)); let ref = db.collection(req.query.brand); if(req.query.alert !== ''){ ref = ref.where(req.query.alert,'==',true); } ref = ref .where('firebaseAddDate', '>', start) .where('firebaseAddDate', '<', end) .orderBy('firebaseAddDate', 'desc'); const snapshot = await ref.limit(50).get(); // 后续处理查询结果逻辑 })
3. 前端传参优化(可选但推荐)
前端调用接口前,将选中的时间用toISOString()方法转成UTC标准时间字符串再传给后端,彻底避免不同环境的时间解析歧义:
// 前端传参示例 const params = { fromDateData: selectedFromDate.toISOString(), toDateData: selectedToDate.toISOString(), // 其他参数 }
内容的提问来源于stack exchange,提问作者Saud Ahmed
相关产品推荐
相关产品推荐

