通过控制面板向Firebase实时数据库添加新值时,我想在特定字段中保存当前日期/时间。

我该如何实现?

请帮助我。

评论

发布您的代码以解决您的问题

#1 楼

最佳做法是将数据保存为TIMESTAMP这样的ServerValue.TIMESTAMP

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Map map = new HashMap();
map.put("timestamp", ServerValue.TIMESTAMP);
ref.child("yourNode").updateChildren(map);


还请记住,在设置TIMESTAMP时,将其设置为Map,但是当您检索它,并将其检索为Long。要获取数据,我建议您使用以下方法:

public static String getTimeDate(long timestamp){
    try{
        DateFormat dateFormat = getDateTimeInstance();
        Date netDate = (new Date(timestamp));
        return dateFormat.format(netDate);
    } catch(Exception e) {
        return "date";
    }
}


编辑:模型类应如下所示:

public class YourModelClass {
    //private fields
    private Map<String, String> timestamp;

    public YourModelClass() {}

    //public setters and getters for the fields

    public void setTimestamp(Map<String, String> timeStamp) {this.timestamp= timestamp;}
    public Map<String, String> getTimestamp() {return timestamp;}
}


请记住,ServerValue.TIMESTAMP只是一个令牌,当Firebase Realtime Database在写操作期间用作子值时,它将转换为服务器端的数字。该日期仅在写入操作完成后才出现在数据库中。

要获取timestamp,还有另一种方法,那就是在Cloud Functions for Firebase中编写函数,这将非常容易如:

exports.currentTime = functions.https.onRequest((req, res) => {
    res.send({"timestamp":new Date().getTime()})
})


您可以在Cloud Function中托管它,而无需用户交互即可获取服务器时间戳。

评论


非常感谢您的回答,希望能解决我的问题。

– Leenah
17-4-24在11:42



我不赞成这样做,因为存储的bn值是一个如图所示的对象...“ {。sv = timestamp}”

–好生活
17年8月31日在17:38



很抱歉,投反对票。您是对的,但是现在您必须提醒盖伊,该模型应该有公共地图时间;在类声明中

–好生活
17年8月31日18:00



@Goodlife是的,你是对的。我刚刚用模型类更新了答案。希望您重新考虑增加答案。谢谢!

– Alex Mamo
17年9月1日在9:02

@NoorHossain请发布有关此特定案例的新问题。

– Alex Mamo
19年11月22日在15:51

#2 楼

Alex Mamo是正确的,但是如果您从模型类中调用它,这就是应该通过的方法

public class FirebMessage {
    public String message;
    public String senderPhoneNumber;
    public String receiverPhoneNumber;
    public Map time;

    public FirebMessage() {
    }

    public FirebMessage(String message, String senderPhoneNumber, String receiverPhoneNumber, Map time) {
        this.message = message;
        this.senderPhoneNumber = senderPhoneNumber;
        this.receiverPhoneNumber = receiverPhoneNumber;
        this.time = time;
    }


然后按以下方式消费

 private void writeNewMessage(String message, String receiver,String sender) {

        FirebMessage firebMessage = new FirebMessage(message, receiver,sender,ServerValue.TIMESTAMP);
        mDatabase.child("messages").push().setValue(firebMessage, new DatabaseReference.CompletionListener() {
            @Override
            public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                if (databaseError != null) {
                   Log.e(TAG,"Data Not saved");

                } else {
                    Log.e(TAG,"Data saved successfully");
                }
            }
        });
    }


#3 楼

在Firebase中使用数据类型Number。


在将数据存储到Fireabase中时存储当前的米利斯。
在检索数据时,您将得到以前存储的米利斯。
解析为Java Date Instance并进一步工作。


评论


感谢您的帮助,能否请您解释一下更多代码?

– Leenah
17年4月24日在9:24

我已经添加了步骤。只要按照这些步骤操作,您肯定会得到结果。

– Mitul Gedeeya
17年4月24日在9:25

但是,我将如何基于millis .... startAt()和endAt()进行查询,而不需要长值。

– Shahood ul Hassan
7月12日15:22