在Firebase中保存和检索日期

noo*_*oob 14 java android date firebase

我有一个具有以下结构的模型

public class OfferModel {
    private String mImageUrl;
    private String mOfferCode;
    private String mOfferTitle;
    private String mOfferDescription;
    private boolean mIsRunning;
    private String mCreatorUid;
    private Date mStartDate;
}
Run Code Online (Sandbox Code Playgroud)

其他一切在保存方面都很好.它将Firebase实时数据库保存为

startDate
    date: 22
    day: 3
    hours: 23
    minutes: 20
    month: 5
    seconds: 50
    time: 1466617850476
    timezoneOffset: -330
    year: 116
Run Code Online (Sandbox Code Playgroud)

但是当我尝试检索它时,日期会出现以下错误 -

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)
Run Code Online (Sandbox Code Playgroud)

我了解Firebase不支持Java Date对象,但由于它将它们保存在地图中,我该如何从该地图中取回日期?有没有在Firebase Android中保存和检索日期的正确方法?

Sun*_*tor 16

您可以将日期存储为纪元日期.您可以使用系统时间System.currentTimeMillis();或使用Firebase服务器时间来使用它们ServerValue.TIMESTAMP.第一个选项是它随时区和系统设置而变化.因此,如果将日期存储为long,则只需将OfferModel字段更改mStartDate为a long,然后在检索对象时使用new Date(long)相应的字段Date.


JP *_*ura 6

使用ISO 8601日期格式

SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:sss'Z'");

String now = ISO_8601_FORMAT.format(new Date());
Run Code Online (Sandbox Code Playgroud)

表示Date为a String具有两个更大的优点:

  • 这是人类可读的("2018-03-30T13:18:39.516Z"vs 1522415925281
  • 在浏览器端,您可以简单地调用 new Date("2018-03-30T13:18:39.516Z")

如果您拥有同时使用Firebase数据的Android和浏览器,这将非常有用。


小智 5

这就是我通过使用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);
}
Run Code Online (Sandbox Code Playgroud)

这就是它在Firebase上的显示方式:

上火的日期

希望能帮助到你..