我想了解如何使用Firebase的ServerValue.TIMESTAMP方法,当我想在Firebase服务器上创建时间戳,然后将其检索到本地客户端时。
在Firebase指南中,只有javascript对此案例有更详细的描述,但我很难想到如何将其转换为我的Android应用程序。
提前致谢!
答案 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)
我知道这个问题已经得到解答,但我想分享我的解决方案版本。
当我使用服务器的时间戳时,我通常需要多次使用它,即我有某种startTime
和endTime
两者都依赖于服务器'的时间,startTime
为NOW
而endTime
为startTime
后的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"