带有 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
我的问题是,当我尝试在手机上的应用程序中检索时,我得到的是当前时间,而不是实际的 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";
}
}
如果时间戳保存为
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()
默认采用本地当前时间。