我正在为android创建一个聊天应用程序。我正在使用Firebase实时数据库来实现此目的。这就是数据库的“聊天”分支的样子:
使用用户唯一ID(例如“513”,“675”等)生成的聊天室有唯一ID。在theese聊天室内,还有消息对象,这些消息对象也具有唯一ID,并且在其中存储了发送日期消息的信息,发件人姓名和邮件文本。 Message对象的构造函数如下:
public Message(String text,String senderUID, Long date){
this.text = text;
this.senderUID = senderUID;
this.date = date;
}
这就是我为每条消息生成Time并将它们发送到firebase数据库的方式。
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calendar = Calendar.getInstance();
String second,hour,minute;
String time;
if(calendar.get(Calendar.SECOND)<10){
second = "0"+calendar.get(Calendar.SECOND);
}
else
{
second = ""+calendar.get(Calendar.SECOND);
}
if(calendar.get(Calendar.MINUTE)<10){
minute = "0"+calendar.get(Calendar.MINUTE);
}
else
{
minute = ""+calendar.get(Calendar.MINUTE);
}
if(calendar.get(Calendar.HOUR)<10){
hour = "0"+calendar.get(Calendar.HOUR);
}
else
{
hour = ""+calendar.get(Calendar.HOUR);
}
time = date + hour + minute + second;
Log.d("time",time);
Message message = new Message(messageEditText.getText().toString(), user.getDisplayName(), Long.valueOf(time));
chatRoomDatabaseRef.child(chatID).child(user.getUid() + generateRandomNumber()).setValue(message);
messageEditText.setText("");
}
});
以下是我如何使用值事件侦听器从数据库获取数据:
chatRoomDatabaseRef.child(chatID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Set<Message> set = new HashSet<Message>();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Message message = snapshot.getValue(Message.class);
set.add(message);
}
messageList.clear();
messageList.addAll(set);
Collections.sort(messageList, new Comparator<Message>() {
@Override
public int compare(Message o1, Message o2) {
return Long.valueOf(o1.date).compareTo(Long.valueOf(o2.date));
}
});
messageAdapter.notifyDataSetChanged();
messageListView.setSelection(messageAdapter.getCount() - 1);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
从Firebase数据库获取数据后,我根据日期属性对其进行排序并列出。一切正常但是当我填写消息的日期属性时,它会根据手机上的当地时间填充因为我无法正确排序消息。时间可能因设备而异。我需要使用一个时间,这对于使用我的应用程序的所有设备来说都很常见。但我找不到办法。
编辑: 我仍然想不通,但作为一个快速的解决方案,我在数据库中创建了一个名为序列号的对象。我在消息构造函数中添加了一个名为序列号的属性。我从数据库中读取序列号,将该号码提供给下一条消息,并为新消息增加数据库中的值。然后我根据该号码订购消息。这不是最好的方法,但在找到更好的方法之前,这是有道理的。
答案 0 :(得分:4)
试试这个
firebase
.database()
.ref("/.info/serverTimeOffset")
.on("value", function(offset) {
let offsetVal = offset.val() || 0;
let serverTime = Date.now() + offsetVal;
console.log("serverTime", serverTime);
});
答案 1 :(得分:0)
用作时间
{{1}}
并检索它
{{1}}