Java 在发送数据时,从Android应用程序中的Firebase检索ServerValue.Timestamp
当我想在Firebase服务器上创建时间戳,然后将其检索到本地客户端时,我想知道如何使用Firebase的ServerValue.TIMESTAMP方法 在Firebase指南中,只有javascript对这种情况有更详细的描述,但我很难弄清楚如何将其翻译到我的Android应用程序中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.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,它就会工作。很抱歉,它不工作。这将抛出异常。这似乎是一个很好的答案,请您将您的答案扩展到所有新手。谢谢