我有一个具有以下结构的模型
public class OfferModel {
private String mImageUrl;
private String mOfferCode;
private String mOfferTitle;
private String mOfferDescription;
private boolean mIsRunning;
private String mCreatorUid;
private Date mStartDate;
}
其他一切在保存方面都很好。它将Firebase实时数据库另存为
startDate
date: 22
day: 3
hours: 23
minutes: 20
month: 5
seconds: 50
time: 1466617850476
timezoneOffset: -330
year: 116
但是当我尝试检索它时,日期会出现以下错误 -
java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.Date
at com.localvine.models.OfferModel.<init>(OfferModel.java:37)
at com.localvine.managers.OfferManager$1.onDataChange(OfferManager.java:62)
at com.google.android.gms.internal.zzafp.zza(Unknown Source)
at com.google.android.gms.internal.zzagp.zzSu(Unknown Source)
at com.google.android.gms.internal.zzags$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:615)
我了解Firebase不支持Java Date对象,但由于它将它们保存在地图中,我该如何从该地图中取回日期?有没有在Firebase Android中保存和检索日期的正确方法?
答案 0 :(得分:15)
您可以将日期存储为纪元日期。您可以使用系统时间System.currentTimeMillis();
或将Firebase服务器时间与ServerValue.TIMESTAMP
一起使用,这是一个漫长的过程。第一个选项是它随时区和系统设置而变化。因此,如果您将日期存储为长日期,则只需将OfferModel
字段mStartDate
更改为long
,然后使用new Date(long)
获取相应的Date
检索对象时。
答案 1 :(得分:4)
这就是我通过使用SimpleDateFormat将日期转换为没有秒,小时或毫秒的日期来设置在Firebase上存储日期的方法。
public void storeDatetoFirebase() {
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(this, 1000);
try {
Date date = new Date();
Date newDate = new Date(date.getTime() + (604800000L * 2) + (24 * 60 * 60));
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
String stringdate = dt.format(newDate);
System.out.println("Submission Date: " + stringdate);
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("My_Date");
databaseReference.child("init_date").setValue(stringdate);
} catch (Exception e) {
e.printStackTrace();
}
}
};
handler.postDelayed(runnable, 1 * 1000);
}
这就是它在Firebase上的显示方式:
希望有所帮助......
答案 2 :(得分:4)
SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:sss'Z'");
String now = ISO_8601_FORMAT.format(new Date());
将Date
表示为String
有两个更大的优势:
"2018-03-30T13:18:39.516Z"
vs 1522415925281
)new Date("2018-03-30T13:18:39.516Z")
如果Android和浏览器都使用Firebase数据,这非常有用。
答案 3 :(得分:2)
虽然firebase支持Date格式数据类型,但我更喜欢以字符串格式保存日期时间,因为通过将其存储为字符串,可以很容易地检索它。
以字符串格式存储当前系统日期时间,就在代码下面。
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
String strDate = dateFormat.format(date).toString();
myRef.child("datetime").setValue(strDate);
现在可以使用strDate存储在firebase中,或者做任何想要对该字符串做的事情。
答案 4 :(得分:0)
您可以在Firebase上设置日期对象
yourReference.setValue(new Date());
有效,但是
我注意到其他问题与日期,当我从数据库手动更改月份时,检索它时值保持不变