目前,Google 版本的 ServerValue.TIMESTAMP
返回 {".sv":"timestamp"}
用作 Firebase 的指令以填充该字段将数据保存到 Firebase 服务器后的服务器时间戳。
但是,当您在客户端创建数据时,您还没有实际的时间戳(即用作创建日期)。您只有在初始保存和随后的检索之后才能访问时间戳,我想这有时为时已晚而且不是很优雅。
在谷歌之前:
更新:忽略此部分,因为它不正确 - 我误解了示例。 ServerValue.TIMESTAMP
始终返回 {".sv":"timestamp"}
。
据我所知,在 pre-google Firebase 中似乎有一个服务器生成的时间戳可用,允许您获取实际时间戳:
import com.firebase.client.ServerValue;
ServerValue.TIMESTAMP // eg. 1466094046
问题:
- 这种保存/检索是在我的模型实例上获取服务器生成的创建日期的唯一方法吗?
- 如果是,您能提出一种实现这种模式的方法吗?
- 我对 ServerValue.TIMESTAMP 的理解是否正确?随着 Google 收购 Firebase,它发生了变化? 更新:没有,@FrankvanPuffelen 回答说在获取过程中没有任何改变。
注意:
我不考虑在客户端使用 new Date()
,因为我一直在阅读它不安全,但如果您有不同的看法,请分享您的想法。
最佳答案
当您在写操作中使用 ServerValue.TIMESTAMP
常量时,您是说 Firebase 数据库服务器在执行写操作时应该确定正确的时间戳。
假设我们运行这段代码:
ref.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
public void onCancelled(DatabaseError databaseError) { }
});
ref.setValue(ServerValue.TIMESTAMP);
这将执行如下:
- 你附加一个监听器
- 你用
ServerValue.TIMESTAMP
写一个值 - Firebase 客户端立即触发一个值事件,该事件具有它将写入服务器的时间戳的近似值
- 您的代码打印该值
- 写操作被发送到 Firebase 服务器
- Firebase 服务器确定实际时间戳并将值写入数据库(假设没有安全规则失败)
- Firebase 服务器将实际时间戳发回给客户端
- Firebase 客户端为实际值引发一个值事件
- 您的代码打印该值
如果您使用 ChildEventListener
而不是 ValueEventListener
,则客户端将在步骤 3 中调用 onChildAdded
和 onChildChanged
在第 8 步中。
自 Firebase 加入 Google 以来,我们生成 ServerValue.TIMESTAMP
的方式没有任何变化。以前有效的代码将继续有效。这也意味着 first answer you linked是处理它的有效方法。
关于android - 如何使用 Firebase 服务器时间戳生成创建日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929003/