React Native中Firestore Timestamp转可读日期的方法求助
解决Firestore自定义Timestamp对象转可读日期格式的问题
核心原因
你拿到的{seconds: XXXXX, nanoseconds: XXXXX}是普通JavaScript对象,不是Firestore SDK提供的Timestamp实例,所以toDate()、toISOString()这些内置方法根本不存在,自然调用失败。React Native提示不可序列化,也是因为原始的Firestore Timestamp实例是特殊对象,一旦被序列化(比如存进状态管理库、AsyncStorage)就会退化成普通的seconds/nanoseconds键值对。
解决步骤
将seconds+nanoseconds转换为JavaScript Date对象
Date构造器接受毫秒级时间戳,所以需要把秒转成毫秒,再加上纳秒转成的毫秒值:// 假设你的日期对象是createdAt = {seconds: 13223213, nanoseconds: 12312312} const totalMs = createdAt.seconds * 1000 + Math.floor(createdAt.nanoseconds / 1000000); const date = new Date(totalMs);这里用
Math.floor是因为纳秒转毫秒会有小数,Date只接受整数毫秒。格式化Date为DD/MM/YYYY HH:mm:ss格式
可以自己写格式化函数,也可以用React Native支持的Intl.DateTimeFormat:自定义格式化函数
function formatToReadableDate(date) { const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始计数,要+1 const year = date.getFullYear(); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${day}/${month}/${year} ${hours}:${minutes}:${seconds}`; } // 使用示例 const readableDate = formatToReadableDate(date);用Intl.DateTimeFormat简化实现
const readableDate = new Intl.DateTimeFormat('en-GB', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false // 24小时制 }).format(date);
额外建议
如果是直接从Firestore获取文档,尽量用doc.data()获取原始数据,此时的日期字段是Firestore Timestamp实例,直接调用createdAt.toDate()就能得到Date对象,不会出现序列化问题。只有当数据被二次序列化(比如存进Redux、AsyncStorage)后,才会变成普通的seconds/nanoseconds对象,这时候就需要用上面的手动转换方法。
内容的提问来源于stack exchange,提问作者David Peña
相关产品推荐
相关产品推荐

