Android Firebase 时间戳

问题描述 投票:0回答:2

带有 onClickListener 的按钮,用于在 child("Date") 中发布时间戳

users.child(user.getUid()).child("Date").setValue(ServerValue.TIMESTAMP);

效果很好。

我的问题是,当我尝试在手机上的应用程序中检索时,我得到的是当前时间而不是实际的时间戳时间。

 users.child(user.getUid()).child("Date").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Date date=new Date();
                SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.getDefault());
                sfd.format(new Date());



                TimeSold.setText(String.valueOf(date));


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });

Firebase 上的时间戳正在发生变化,它应该因用户而异。在我的应用程序上,它只是为我提供所有用户相同的当前时间。

我的Firebase

enter image description here

java android firebase firebase-realtime-database
2个回答
4
投票

我的问题是,当我尝试在手机上的应用程序中检索时,我得到的是当前时间,而不是实际的 TIMESTAMP 时间。

发生这种情况是因为在回调内部,您实际上是在创建一个新的

Date
对象,而不是从数据库中获取它。要解决这个问题,请使用以下方法:

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

以及以下代码行从数据库获取日期:

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long date = ds.getValue(Long.class);
        Log.d(TAG, getTimeDate(date));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
users.child(user.getUid()).child("Date").addListenerForSingleValueEvent(valueEventListener);

编辑:

要使用格式化的日期,请使用以下方法:

public static String getTimeDate(long timestamp){
    try{
        Date netDate = (new Date(timestamp));
        SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.getDefault());
        return sfd.format(netDate);
    } catch(Exception e) {
        return "date";
    }
}

1
投票

如果时间戳保存为

Long
值,请输入:

Date date = new Date(dataSnapshot.getValue(Long.class));
SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", 
                                    Locale.getDefault());
String text = sfd.format(date);
TimeSold.setText(text);

onDataChange
回调中

您的解决方案不起作用,因为您将当前日期传递给格式,正如您所写的:

Date date = new Date()

默认采用本地当前时间。

© www.soinside.com 2019 - 2024. All rights reserved.