Firebase数据库的常用时间

时间:2017-04-29 14:58:41

标签: android firebase time firebase-realtime-database

我正在为android创建一个聊天应用程序。我正在使用Firebase实时数据库来实现此目的。这就是数据库的“聊天”分支的样子:enter image description here

使用用户唯一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数据库获取数据后,我根据日期属性对其进行排序并列出。一切正常但是当我填写消息的日期属性时,它会根据手机上的当地时间填充因为我无法正确排序消息。时间可能因设备而异。我需要使用一个时间,这对于使用我的应用程序的所有设备来说都很常见。但我找不到办法。

编辑: 我仍然想不通,但作为一个快速的解决方案,我在数据库中创建了一个名为序列号的对象。我在消息构造函数中添加了一个名为序列号的属性。我从数据库中读取序列号,将该号码提供给下一条消息,并为新消息增加数据库中的值。然后我根据该号码订购消息。这不是最好的方法,但在找到更好的方法之前,这是有道理的。

2 个答案:

答案 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}}