如何将Firebase Firestore Timestamp转换为Long值及字符串转换异常问题
嘿,我来帮你搞定这两个Firestore时间戳的问题!
1. 将Firestore Timestamp转换为Long类型数值
Firestore的Timestamp对象本身就提供了直接获取时间戳数值的方法,分两种常用场景:
- 获取秒级时间戳(Long类型):调用
getSeconds()方法,返回从Unix纪元(1970-01-01 00:00:00 UTC)开始的秒数 - 获取毫秒级时间戳(Long类型,更符合日常开发习惯):把秒数乘以1000,再加上纳秒部分转换为毫秒的数值(因为1毫秒=1,000,000纳秒)
示例代码(Java):
// 假设你已经从Firestore文档中获取到了Timestamp对象 Timestamp firestoreTimestamp = documentSnapshot.getTimestamp("yourTimestampField"); // 转换为秒级Long数值 Long secondTimestamp = firestoreTimestamp.getSeconds(); // 转换为毫秒级Long数值 Long millisecondTimestamp = firestoreTimestamp.getSeconds() * 1000 + firestoreTimestamp.getNanoseconds() / 1000000;
2. 解决
FieldValue.serverTimestamp().toString()的异常问题 你遇到的问题其实是个常见的误区:FieldValue.serverTimestamp()并不是一个实际的Timestamp对象,它只是一个告诉Firestore「在服务器写入数据时自动生成当前时间戳」的占位符。直接调用它的toString(),只会输出这个占位符对象的类信息和哈希值,也就是你截图里看到的结果。
要正确获取字符串形式的时间戳,分两种情况处理:
情况一:需要服务器生成的时间戳转字符串
你得先把数据写入Firestore,等服务器返回实际的Timestamp后再转换:
// 构建数据,用serverTimestamp作为占位符 Map<String, Object> data = new HashMap<>(); data.put("createdAt", FieldValue.serverTimestamp()); // 写入Firestore并获取实际时间戳 db.collection("yourCollection").add(data) .addOnSuccessListener(docRef -> { docRef.get().addOnSuccessListener(snapshot -> { Timestamp serverTimestamp = snapshot.getTimestamp("createdAt"); // 转换为自定义格式的字符串(比如yyyy-MM-dd HH:mm:ss) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String dateStr = sdf.format(new Date(serverTimestamp.getSeconds() * 1000)); System.out.println("服务器时间戳字符串:" + dateStr); }); });
情况二:只需要客户端当前时间的字符串
如果不需要服务器校准的时间,直接在客户端生成即可:
// 获取毫秒级时间戳字符串 String currentMillisStr = String.valueOf(System.currentTimeMillis()); // 获取格式化的日期字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String currentDateStr = sdf.format(new Date());
内容的提问来源于stack exchange,提问作者Ketan Choyal
相关产品推荐
相关产品推荐

