Firestore serverTimestamp查询及比较问题求助(Cloud Function场景)
解决Firestore时间戳比较的问题
嘿,刚好我之前也碰到过这个情况,给你捋清楚怎么处理:
首先你得知道——用admin.firestore.FieldValue.serverTimestamp()存在Firestore里的字段,本质是一个Firestore的Timestamp对象,你看到的2018-05-10T22:51:37.236Z只是它默认toString()输出的ISO格式字符串而已,不是它的真实类型。
所以要做比较的话,有几种简单的方法:
方法1:转成JavaScript Date对象
直接调用Timestamp对象的toDate()方法,就能得到标准的JS Date对象,这样就可以和你手里的startTime(Date对象)直接比较了:
snapshot.forEach(doc => { const docTimestamp = doc.data().timestamp; const docDate = docTimestamp.toDate(); // 转成Date // 现在就能直接比较了 if (docDate >= startTime) { // 你的业务逻辑 } });
方法2:转成Unix时间戳(毫秒级)
如果习惯用数字类型的时间戳比较,转成Date后调用getTime()就行:
const unixTimestamp = docTimestamp.toDate().getTime(); // 得到1525973497236这样的数字 if (unixTimestamp >= startTime.getTime()) { // 逻辑处理 }
方法3:直接用Firestore Timestamp的内置比较方法
其实Timestamp对象本身就自带比较方法,不用转Date也能搞定,比如:
// 先把要比较的Date转成Firestore Timestamp const compareTimestamp = admin.firestore.Timestamp.fromDate(startTime); if (docTimestamp.isAfter(compareTimestamp)) { // 文档时间在startTime之后 } if (docTimestamp.isBefore(compareTimestamp)) { // 文档时间在startTime之前 } if (docTimestamp.isEqual(compareTimestamp)) { // 时间完全相等 }
另外补充一句:你之前查询用ref.where("timestamp", ">=", startTime)有效,是因为Firestore会自动把你传入的Date对象转换成对应的Timestamp来做查询匹配,所以后端的比较是没问题的。
要是你真的碰到存成字符串的情况(比如之前误操作存了ISO字符串),那也可以用new Date(isoString)把字符串转成Date对象再比较,但正常用serverTimestamp()存的都是Timestamp类型,所以上面的方法应该就能解决你的问题啦。
内容的提问来源于stack exchange,提问作者Zaff
相关产品推荐
相关产品推荐

