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

Java 在发送数据时,从Android应用程序中的Firebase检索ServerValue.Timestamp,java,android,firebase,timestamp,chat,Java,Android,Firebase,Timestamp,Chat,当我想在Firebase服务器上创建时间戳,然后将其检索到本地客户端时,我想知道如何使用Firebase的ServerValue.TIMESTAMP方法 在Firebase指南中,只有javascript对这种情况有更详细的描述,但我很难弄清楚如何将其翻译到我的Android应用程序中 提前谢谢 Firebase.ServerValue.TIMESTAMP被设置为映射(包含{.sv:“TIMESTAMP”}),它告诉Firebase用服务器的时间填充该字段。当该数据被读回时,它是实际的unix时

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

在Firebase指南中,只有javascript对这种情况有更详细的描述,但我很难弄清楚如何将其翻译到我的Android应用程序中


提前谢谢

Firebase.ServerValue.TIMESTAMP
被设置为
映射(包含
{.sv:“TIMESTAMP”}
),它告诉Firebase用服务器的时间填充该字段。当该数据被读回时,它是实际的unix时间戳,它是一个
长的

类似这样的方法会奏效:

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);

例如,您可以看到我对这个问题的回答:

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

当我使用服务器的时间戳时,我通常需要多次使用它,即我有某种
startTime
endTime
,它们都取决于服务器的时间,其中
startTime
NOW
endTime
startTime
之后的X秒/分/小时,因此,为了节省对服务器的多个请求,我将服务器的时间保存在数据库中名为
serverTime
的根子级中,并使用它设置所有依赖值

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

一个简短的示例代码:

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) { }
                });

            }
        });
    }
}
import android.support.annotation.NonNull;
导入com.google.android.gms.tasks.OnCompleteListener;
导入com.google.android.gms.tasks.Task;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.ServerValue;
导入com.google.firebase.database.ValueEventListener;
公共类服务器时间{
公共接口OnTimeRetrievedListener{
void onTimeRetrieved(长时间戳);
}
私有最终数据库参考数据库;
公共服务器时间(数据库参考数据库){
this.db=db.child(“服务器时间”);
}
/**
*获取服务器的时间戳(以毫秒为单位)。
*@param侦听器{@link-ontimererievedListener}
*/
public void getTime(最终OnTimeRetrievedListener侦听器){
if(侦听器==null){
返回;
}
db.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
db.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
onTimeRetrieved(dataSnapshot.getValue(Long.class));
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});
}
});
}
}

如果您不想通过写入数据库来计算时间戳,您可以得到它的即时近似值。即使在离线情况下也能正常工作,在大多数情况下都足够了

读取值

/.info/serverTimeOffset

并将其添加到
new Date().time()
首先,向firebase服务器发送一个对象

FirebaseDatabase.getInstance().getReference(“serverTimeTest”).setValue(新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”

请参见,谢谢,但我想知道Java中的语法,而不是javascript中的语法,如答案所示。有人能翻译这个js片段吗?:)这是一个Java/Android问题,但事实上,这个答案是基于JavaScript的。OP找到了一个解决方案并发布了它,但后来删除了它。也许您仍然可以访问它,当我们执行
updateChildren
时,我们如何知道值?它不起作用。该对象无法转换为DateFormat。@ranasaha一旦将该对象推送到firebase,它就会工作。很抱歉,它不工作。这将抛出异常。这似乎是一个很好的答案,请您将您的答案扩展到所有新手。谢谢