发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp
Posted
技术标签:
【中文标题】发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp【英文标题】:Retrieve ServerValue.Timestamp from Firebase in Android app, when data is sent 【发布时间】:2014-11-02 20:40:38 【问题描述】:我想知道如何使用 Firebase 的 ServerValue.TIMESTAMP 方法,当我想在 Firebase 服务器上创建时间戳,然后将其检索到本地客户端。
在 Firebase 指南中,只有 javascript 对此案例有更详细的描述,但我很难弄清楚如何将其转换为我的 android 应用程序。
提前致谢!
【问题讨论】:
见***.com/a/25308684/209103 谢谢,但我想知道 Java 中的语法,而不是 javascript,就像那里的答案一样。谁能翻译那个js sn-p? :) 这是一个 Java/Android 问题,但实际上该答案是基于 JavaScript 的。 OP找到了解决方案并发布了该解决方案,但已将其删除。也许您仍然可以通过***.com/a/25321169/209103 访问它 【参考方案1】: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
【讨论】:
当我们做updateChildren
时如何知道值?【参考方案2】:
我知道这个问题已经得到解答,但我想分享我的解决方案版本。
当我使用服务器的时间戳时,我通常需要多次使用它,即我有某种startTime
和endTime
,它们都取决于服务器的时间,其中startTime
是NOW
和endTime
在 startTime
之后 X 秒/分钟/小时,因此为了节省对服务器的多个请求,我将服务器的时间保存在数据库中名为 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)
);
);
【讨论】:
【参考方案3】:如果您不想写入数据库来计算时间戳,您可以立即获得它的近似值。甚至可以离线工作,并且对于大多数情况来说已经足够了。
读取值
/.info/serverTimeOffset
并将其添加到new Date().time()
【讨论】:
似乎是一个很好的答案,您能否将您的答案扩展到所有新手。谢谢【参考方案4】:首先,向 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"
【讨论】:
它不工作。该对象无法转换为 DateFormat。 @ranasaha 一旦你将该对象推送到firebase,它就会起作用 抱歉,它不起作用。它会抛出异常。以上是关于发送数据时,从 Android 应用中的 Firebase 检索 ServerValue.Timestamp的主要内容,如果未能解决你的问题,请参考以下文章
当 sql server 数据库中的数据发生变化时,从一个 android 应用程序向另一个应用程序发送推送通知
休眠后,Android应用程序在kindle fire上关闭