如何使用Firebase服务器时间戳生成日期?

Voy*_*Voy 16 android timestamp firebase firebase-realtime-database

目前,Google的ServerValue.TIMESTAMP退货版本将{".sv":"timestamp"}用作Firebase的指令,以便在将数据保存到Firebase服务器后使用服务器时间戳填充该字段.

但是,当您在客户端创建数据时,您还没有实际的时间戳(即用作创建日期).在初始保存和随后的检索之后,您只能访问时间戳,我想 - 有时候太晚了,不太优雅.


在Google之前:

更新:忽略此部分,因为它不正确 - 我误解了这些例子.ServerValue.TIMESTAMP总是回来的{".sv":"timestamp"}.

据我所知,在google之前的Firebase中,似乎有一个服务器生成的时间戳可用于获取实际时间戳:

import com.firebase.client.ServerValue;
ServerValue.TIMESTAMP // eg. 1466094046
Run Code Online (Sandbox Code Playgroud)

(参考1,参考2)


问题:

  1. 这样的保存/检索是在我的模型实例上获取服务器生成的创建日期的唯一方法吗?
  2. 如果是,你能提出一种实施这种模式的方法吗?
  3. 我是否正确理解ServerValue.TIMESTAMP已经改变了谷歌收购Firebase?更新:不,@ FrankkuPuffelen回复说在收购过程中没有任何改变.

注意:

我不打算new Date()在客户端使用,因为我一直在阅读它并不安全,但如果你认为不同,请分享你的想法.

Fra*_*len 26

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);
Run Code Online (Sandbox Code Playgroud)

这将执行如下:

  1. 你附上一个听众
  2. 你写了一个值 ServerValue.TIMESTAMP
  3. Firebase客户端立即触发一个值事件,其中包含将在服务器上写入的时间戳的近似值
  4. 您的代码打印该值
  5. 写入操作将发送到Firebase服务器
  6. Firebase服务器确定实际时间戳并将值写入数据库(假设没有安全规则失败)
  7. Firebase服务器将实际时间戳发送回客户端
  8. Firebase客户端会为实际值引发值事件
  9. 您的代码打印该值

如果您使用的是ChildEventListener代替a ValueEventListener,则客户端将onChildAdded在步骤3和onChildChanged步骤8中调用.

ServerValue.TIMESTAMP自从Firebase加入Google以来,我们生成的方式没有任何改变.之前有效的代码将继续有效.这也意味着您链接第一个答案是处理它的有效方法.