如何将JavaScript本地时间日期转为UTC以正确查询Firestore?
解决Firestore日期查询的时区问题
首先纠正你的代码里一个关键错误:where方法的参数顺序应该是字段名、操作符、值,你写反了,这也是导致查询结果错误的原因之一。
接下来解决时区问题:JavaScript的new Date(year, month, day)会基于本地时区创建日期对象,而Firestore存储的日期本质是UTC时间戳,直接用本地时间的Date对象查询会导致范围偏差。你可以通过以下两种方式生成UTC对应的Date对象:
方法1:直接用Date.UTC构建UTC时间戳
Date.UTC()会返回指定日期的UTC时间戳,用这个时间戳创建的Date对象会对应UTC时区的目标日期:
// 注意:JavaScript月份是0索引(0=1月,10=11月) const utcTimestamp = Date.UTC(2022, 10, 31); const queryDate = new Date(utcTimestamp); console.log("UTC日期:", queryDate.toUTCString()); // 修正where参数顺序:字段名在前 queryCode = queryCode.where("dbDateProperty", ">=", queryDate);
方法2:从本地Date提取信息构建UTC日期
如果你的原始日期来自用户输入的本地日期,可以提取年、月、日信息,再用Date.UTC转换:
const localDate = new Date(2022, 10, 31); const queryDate = new Date(Date.UTC( localDate.getFullYear(), localDate.getMonth(), localDate.getDate() )); queryCode = queryCode.where("dbDateProperty", ">=", queryDate);
额外说明
Firestore的日期字段存储的是独立于时区的时间戳,当你传入正确的UTC日期对象时,查询会匹配对应时间戳范围内的文档。测试时可以用toUTCString()或getTime()验证日期的UTC时间戳是否符合预期。
内容的提问来源于stack exchange,提问作者Bilal Abdeen
相关产品推荐
相关产品推荐

