在发送数据时,从Android应用中的Firebase检索ServerValue.Timestamp

时间:2014-09-09 12:16:07

标签: java android firebase timestamp chat

我想了解如何使用Firebase的ServerValue.TIMESTAMP方法,当我想在Firebase服务器上创建时间戳,然后将其检索到本地客户端时。

在Firebase指南中,只有javascript对此案例有更详细的描述,但我很难想到如何将其转换为我的Android应用程序。

提前致谢!

4 个答案:

答案 0 :(得分:10)

Firebase.ServerValue.TIMESTAMP设置为Map(包含{.sv: "timestamp"}),告知Firebase使用服务器的时间填充该字段。当回读该数据时,它是实际的unix时间戳,它是Long

这样的事情会起作用:

Firebase ref = new Firebase("https://YOUR-FIREBASE.firebaseio.com");    

ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        Long timestamp = (Long) snapshot.getValue();
        System.out.println(timestamp);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

ref.setValue(ServerValue.TIMESTAMP);

另一个例子,你可以看到我对这个问题的回答:Android chat crashes on DataSnapshot.getValue() for timestamp

答案 1 :(得分:2)

我知道这个问题已经得到解答,但我想分享我的解决方案版本。

当我使用服务器的时间戳时,我通常需要多次使用它,即我有某种startTimeendTime两者都依赖于服务器'的时间,startTimeNOWendTimestartTime后的X秒/分钟/小时,因此要将多个请求留给服务器,我会保存服务器&#39 ; s在数据库中名为serverTime的根子项中的时间,我用它来设置所有相关值。

另一方面,由于Firebase与ServerValue.Timestamp一起使用的方式,最终它会触发2个事件(添加和更改),第一个事件具有本地时间戳,第二个事件具有实际服务器的时间戳。因此,为了克服没有收到正确时间的问题,我添加了一个简单的OnCompleteListener

一个简短的示例代码:

import android.support.annotation.NonNull;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ServerValue;
import com.google.firebase.database.ValueEventListener;

public class ServerTime {

    public interface OnTimeRetrievedListener {

        void onTimeRetrieved(Long timestamp);
    }

    private final DatabaseReference db;

    public ServerTime(DatabaseReference db) {
        this.db = db.child("serverTime");
    }

    /**
     * Gets the server's timestamp in milliseconds.
     * @param listener {@link OnTimeRetrievedListener}
     */
    public void getTime(final OnTimeRetrievedListener listener) {
        if (listener == null) {
            return;
        }

        db.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {

                db.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        listener.onTimeRetrieved(dataSnapshot.getValue(Long.class));
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) { }
                });

            }
        });
    }
}

答案 2 :(得分:2)

如果您不想写入数据库来计算时间戳,您可以立即得到它。即使离线工作也适用于大多数情况。

读取值

/.info/serverTimeOffset

并将其添加到new Date().time()

答案 3 :(得分:0)

首先,将对象发送到Firebase服务器

FirebaseDatabase.getInstance().getReference("serverTimeTest").setValue(new KKModel());

模型类

class KKModel{
    public String someField = "value";
    public Object creationDate = ServerValue.TIMESTAMP;

    public String creationDate() {
        return SimpleDateFormat.getDateInstance(DateFormat.SHORT, Locale.US).format(creationDate);
    }
}

用法

object.creationDate()运行良好的测试结果"9/6/18"