Firestore Timestamp调用toDate()返回错误UTC日期如何解决?
问题成因
- 你遇到的是Firestore Emulator v9.16.0的已知缺陷:该版本模拟器在非UTC时区的运行环境下,处理Timestamp对象的
toDate()方法时,会错误将存储的UTC时间戳识别为本地时区的时间,再转换为JS Date对象时就会产生和本地时区偏移量一致的误差。你遇到的2小时误差,对应运行环境时区为UTC+2的场景。 - 存储在Firestore内的原始时间戳本身是正确的,这也是模拟器UI悬浮提示能显示正确UTC时间的原因,误差仅出现在模拟器的Node.js SDK读取转换环节。
解决方案
你可以任选以下一种方案解决:
- 升级Firebase Emulator到v9.17.0及以上版本,该版本已经官方修复了这个时区处理bug,升级后原有代码无需修改即可返回正确时间。
- 如果暂时无法升级版本,可直接读取Timestamp的原始毫秒时间戳生成Date对象,规避
toDate()的转换bug:
let maintConfigRef = db.collection("Configurations").doc("Maintenance"); let maintConfigDoc = await maintConfigRef.get(); if (maintConfigDoc.exists) { let maintConfigData = maintConfigDoc.data(); // 直接用原始毫秒时间戳生成Date,不受模拟器bug影响 let endDate = new Date(maintConfigData.EndDate.toMillis()).toJSON(); console.log(endDate); };
- 启动模拟器时强制指定运行时区为UTC,也可以规避该问题:
- Linux/macOS 启动命令:
TZ=UTC firebase emulators:start - Windows 可先设置系统环境变量
TZ=UTC再启动模拟器
- Linux/macOS 启动命令:
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

